freecodecamp刷题答案及知识点(JavaScript基础数据结构)

使用数组存储不同类型的数据
我们已经定义了一个名为 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'));

你可能感兴趣的:(JavaScript,前端)