使用数组存储不同类型的数据
我们已经定义了一个名为 yourArray 的变量。 请修改代码,将一个含有至少 5 个元素的数组赋值给 yourArray 变量。 你的数组中应包含至少一个 string 类型的数据、一个 number 类型的数据和一个 boolean 类型的数据。
let yourArray=["1",2,true,"fuhu","ufgug"]; // 修改这一行
使用方括号访问数组的元素
在本挑战中,请将 myArray 中的第二个元素(索引为 1)设置为除了 b 以外的任意值。
let myArray = ["a", "b", "c", "d"];
// 只修改这一行下面的代码
myArray[1]=1;
// 只修改这一行上面的代码
console.log(myArray);
使用 push() 和 unshift() 为数组添加元素
push() 方法会将元素插入到数组的末尾,而 unshift() 方法会将元素插入到数组的开头。
我们已经定义了一个 mixedNumbers 函数,它接收一个数组作为参数。 请修改这个函数,使用 push() 和 unshift() 来将 ‘I’, 2, ‘three’ 插入到数组开头;将 7, ‘VIII’, 9 插入到数组的末尾。最终这个函数的返回值就会是一个依次包含不同形式的 1-9 的数组。
function mixedNumbers(arr) {
// 只修改这一行下面的代码
arr.push(7,'VIII', 9);
arr.unshift('I', 2, 'three');
// 只修改这一行上面的代码
return arr;
}
console.log(mixedNumbers(['IV', 5, 'six']));
使用 pop() 和 shift() 从数组中删除元素
push() 和 unshift() 都有一个与它们作用相反的函数:pop() 和 shift()。 与插入元素相反,pop() 会从数组的末尾移除一个元素,而 shift() 会从数组的开头移除一个元素。 pop() 和 shift() 与 push() 和 unshift() 的关键区别在于,用于删除元素的方法不接收参数,而且每次只能删除数组中的一个元素。
我们已经定义了一个 popShift 函数,它接收一个数组作为输入参数并返回一个新的数组。 请修改这个函数,使用 pop() 和 shift() 来移除输入的数组中的第一个元素和最后一个元素,并将这两个被移除的元素分别赋值给对应的变量,使得最终返回的数组里包含这两个值。
function popShift(arr) {
let popped=arr.pop(); // 修改这一行
let shifted=arr.shift(); // 修改这一行
return [shifted, popped];
}
console.log(popShift(['challenge', 'is', 'not', 'complete']));
使用 splice() 删除元素
splice() 可以让我们从数组中的任意位置连续删除任意数量的元素。
splice() 最多可以接受 3 个参数,但现在我们先关注前两个。 splice() 接收的前两个参数是整数,表示正在调用 的splice() 数组中的元素的索引或位置。 别忘了,数组的索引是从 0 开始的,所以我们要用 0 来表示数组中的第一个元素。 splice() 的第一个参数代表从数组中的哪个索引开始移除元素,而第二个参数表示要从数组中的这个位置开始删除多少个元素。
splice() 不仅会修改调用该方法的数组,还会返回一个包含被移除元素的数组。
我们已经定义了数组 arr。 请使用 splice() 从 arr 里移除元素,使剩余的元素之和为 10。
const arr = [2, 4, 5, 1, 7, 5, 2, 1];
// 只修改这一行下面的代码
arr.splice(0,1);
arr.splice(3,4);
// 只修改这一行上面的代码
console.log(arr);
使用 splice() 添加元素
splice() 方法最多可以接收 3 个参数
第三个参数可以是一个或多个元素,这些元素会被添加到数组中。 这样,我们能够便捷地将数组中的一个或多个连续元素换成其他的元素。
我们已经定义了一个 htmlColorNames 函数,它以一个 HTML 颜色的数组作为输入参数。
请修改这个函数,使用 splice() 来移除数组中的前两个元素,
并在对应的位置上添加 ‘DarkSalmon’ 和 ‘BlanchedAlmond’。
function htmlColorNames(arr) {
// 只修改这一行下面的代码
arr.splice(0,2,'DarkSalmon','BlanchedAlmond');
// 只修改这一行上面的代码
return arr;
}
console.log(htmlColorNames(['DarkGoldenRod', 'WhiteSmoke', 'LavenderBlush', 'PaleTurquoise', 'FireBrick']));
使用 slice() 复制数组元素
slice() 不会修改数组,而是会复制,或者说*提取(extract)*给定数量的元素到一个新数组。 slice() 只接收 2 个输入参数:第一个是开始提取元素的位置(索引),第二个是提取元素的结束位置(索引)。 提取的元素中不包括第二个参数所对应的元素。
我们已经定义了一个 forecast 函数,它接受一个数组作为参数。 请修改这个函数,利用 slice() 从输入的数组中提取信息,最终返回一个包含元素 warm 和 sunny 的新数组。
function forecast(arr) {
// 只修改这一行下面的代码
arr=arr.slice(2,4);
return arr;
}
// 只修改这一行上面的代码
console.log(forecast(['cold', 'rainy', 'warm', 'sunny', 'cool', 'thunderstorms']));
使用展开运算符复制数组
slice() 可以让我们从一个数组中选择一些元素来复制到新数组中,而 ES6 中又引入了一个简洁且可读性强的语法:展开运算符(spread operator),它能让我们方便地复制数组中的所有元素。 展开语法写出来是这样:…
我们已经定义了一个 copyMachine 函数,它接受 arr(一个数组)和 num(一个数字)作为输入参数。 该函数需要返回一个由 num 个 arr 组成的新的二维数组。 同时,我们写好了大致的流程,只是细节实现还没有写完。 请修改这个函数,使用展开语法,使该函数能正常工作.
function copyMachine(arr, num) {
let newArr = [];
while (num >= 1) {
// 只修改这一行下面的代码
let arr1=[...arr];
newArr.push(arr1);
// 只修改这一行上面的代码
num--;
}
return newArr;
}
console.log(copyMachine([true, false, true], 2));
使用展开运算符合并数组
我们已经定义了一个返回 sentence 变量的 spreadOut 函数。 请修改这个函数,利用 spread 使该函数返回数组 [‘learning’, ‘to’, ‘code’, ‘is’, ‘fun’]。
function spreadOut() {
let fragment = ['to', 'code'];
let sentence=['learning',...fragment,'is','fun']; // 修改这一行
return sentence;
}
console.log(spreadOut());
使用 indexOf() 检查元素是否存在
indexOf() 方法接受一个元素作为输入参数,并返回该元素在数组中的位置(索引);若该元素不存在于数组中则返回 -1。
indexOf() 在快速检查一个数组中是否存在某个元素时非常有用。 我们已经定义了一个 quickCheck 函数,它接受一个数组和一个元素作为输入参数。 请通过 indexOf() 方法修改这个函数,使得当传入的参数在数组中存在时返回 true,否则返回 false。
function quickCheck(arr, elem) {
// 只修改这一行下面的代码
if(arr.indexOf(elem)!=-1)
{
return true;
}
else
return false;
// 只修改这一行上面的代码
}
console.log(quickCheck(['squash', 'onions', 'shallots'], 'mushrooms'));
使用 for 循环遍历数组中的全部元素
我们已经定义了 filteredArray 函数,它接受一个嵌套的数组 arr 和一个 elem 作为参数,并要返回一个新数组。 arr 数组中嵌套的数组里可能包含 elem 元素,也可能不包含。 请修改该函数,用一个 for 循环来做筛选,使函数返回一个由 arr 中不包含 elem 的数组所组成的新数组。
function filteredArray(arr, elem) {
// 只修改这一行下面的代码
let newArr=[];
for(let i=0;i<arr.length;i++)
{
if(arr[i].indexOf(elem)==-1)
{
newArr.push(arr[i]);
}
}
// 只修改这一行上面的代码
return newArr;
}
console.log(filteredArray([[3, 2, 3], [1, 6, 3], [3, 13, 26], [19, 3, 9]], 3));
创建复杂的多维数组
我们已经定义了一个叫做 myNestedArray 的数组变量。 请修改 myNestedArray,使用字符串(string)、数字(number)或布尔值(boolean)的任意组合作为数组的元素,并让 myNestedArray 刚好有 5 层(注意,最外层的数组是第 1 层)。 同时,请在第 3 层的数组中包含字符串 deep;在第 4 层的数组中包含字符串 deeper,在第 5 层的数组中包含字符串 deepest。
let myNestedArray = [
// 只修改这一行下面的代码
['unshift', false, 1, 2, 3, 'complex',
'nested',['deep',['deeper',['deepest']]]],
// 只修改这一行上面的代码
];
将键值对添加到对象中
对象(object)本质上是键值对(key-value pair)的集合。 或者说,一系列被映射到唯一标识符的数据就是对象;习惯上,唯一标识符叫做属性(property)或者键(key);数据叫做值(value)。
我们已经为你创建了包含三个项目的 foods 对象。 请使用上述任意语法,来为 foods 对象添加如下三个键值对:bananas 属性,值为 13;grapes 属性,值为 35;strawberries 属性,值为 27。
let foods = {
apples: 25,
oranges: 32,
plums: 28
};
// 只修改这一行下面的代码
foods.bananas=13;
foods.grapes=35;
foods.strawberries=27;
// 只修改这一行上面的代码
console.log(foods);
修改嵌套在对象中的对象
我们已经定义了一个 userActivity 对象,它包含了另一个对象。 请将 online 的属性值改为 45。
let userActivity = {
id: 23894201352,
date: 'January 1, 2017',
data: {
totalUsers: 51,
online: 42
}
};
// 只修改这一行下面的代码
userActivity.data.online=45;
// 只修改这一行上面的代码
console.log(userActivity);
使用方括号访问属性名称
我们已经定义了 checkInventory 函数,它接受一个被扫描到的商品名作为输入参数。 请让这个函数返回 foods 对象中,以 scannedItem 的值所命名的属性对应的属性值。 在本挑战中,只有合理有效的属性名会作为参数传入 checkInventory,因此你不需要处理参数无效的情况。
let foods = {
apples: 25,
oranges: 32,
plums: 28,
bananas: 13,
grapes: 35,
strawberries: 27
};
function checkInventory(scannedItem) {
// 只修改这一行下面的代码
return foods[scannedItem];
// 只修改这一行上面的代码
}
console.log(checkInventory("apples"));
使用 delete 关键字删除对象属性
请使用 delete 关键字来移除 foods 中的 oranges、plums 和 strawberries 属性。
let foods = {
apples: 25,
oranges: 32,
plums: 28,
bananas: 13,
grapes: 35,
strawberries: 27
};
// 只修改这一行下面的代码
delete foods.oranges;
delete foods.plums;
delete foods.strawberries;
// 只修改这一行上面的代码
console.log(foods);
检查对象是否具有某个属性
JavaScript 为我们提供了两种不同的方式来实现这个功能: 一个是通过 hasOwnProperty() 方法,另一个是使用 in 关键字。 假如我们有一个 users 对象,为检查它是否含有 Alan 属性,可以这样写:
users.hasOwnProperty('Alan');
'Alan' in users;
请完善这个函数,如果传递给它的对象包含四个名字 Alan、Jeff、Sarah 和 Ryan,函数返回 true,否则返回 false。
function isEveryoneHere(userObj) {
// 只修改这一行下面的代码
if('Alan' in userObj&&'Jeff' in userObj&&'Sarah' in userObj&&'Ryan' in userObj)
{
return true;
}
else
return false;
// 只修改这一行上面的代码
}
console.log(isEveryoneHere(users));
使用 for…in 语句遍历对象
如果我们想要遍历对象中的所有属性, 只需要使用 JavaScript 中的 for…in 语句即可。 以遍历 users 对象的属性为例:
for (let user in users) {
console.log(user);
}
我们已经定义了一个 countOnline 函数,它接收一个 users 对象参数。 请在其中使用 for…in 语句来遍历传入函数的 users 对象中的用户,并返回 online 属性为 true 的用户数量。
function countOnline(usersObj) {
// 只修改这一行下面的代码
let a=0;
for(let user in usersObj)
{
if(usersObj[user].online==true)
a++;
}
return a;
// 只修改这一行上面的代码
}
使用 Object.keys() 生成由对象的所有属性组成的数组
我们可以给 Object.keys() 方法传入一个对象作为参数,来生成包含对象所有键的数组。 这会返回一个由对象中所有属性(字符串)组成的数组。 需要注意的是,数组中元素的顺序是不确定的。
请完成 getArrayOfUsers 函数的实现,使其返回一个由输入对象中的所有属性所组成的数组。
function getArrayOfUsers(obj) {
// 只修改这一行下面的代码
let user=Object.keys(obj);
return user;
// 只修改这一行上面的代码
}
console.log(getArrayOfUsers(users));
修改存储在对象中的数组
请看一下代码编辑器中我们为你写好的对象。 user 对象包含 3 个属性; data 对象包含 5 个属性,其中包含一个叫做 friends 的数组。 这就是对象作为数据结构所展现出的灵活性。 我们已经写好了 addFriend 函数的一部分, 请你完成这个函数,使其接受一个 user 对象,将 friend 参数中的名字添加到 user.data.friends 数组中并返回该数组。
function addFriend(userObj, friend) {
// 只修改这一行下面的代码
userObj.data.friends.push(friend);
return userObj.data.friends;
// 只修改这一行上面的代码
}
console.log(addFriend(user, 'Pete'));