2.8 KiB
id, title, challengeType, forumTopicId
id | title | challengeType | forumTopicId |
---|---|---|---|
587d7da9367417b2b2512b68 | 使用 reduce 方法分析数据 | 1 | 301313 |
--description--
reduce()
(即Array.prototype.reduce()
),是 JavaScript 所有数组操作中最常用的方法。几乎可以用reduce
方法解决所有数组处理问题。
reduce
方法是处理数组更通用的方式,而且filter
和map
方法都可以当作是reduce
的特殊实现。 reduce
方法遍历数组中的每个项目并返回单个值(即字符串、数字、对象、数组)。 这是通过在每次迭代中调用一个回调函数来实现的。
回调函数接受四个参数。第一个参数称为叠加器,它是上一次迭代中回调函数的返回值,第二个参数是当前正在处理的数组元素,第三个参数是该参数的索引,第四个参数是在其上调用 reduce
方法的数组。
除了回调函数,reduce
还有一个额外的参数做为叠加器的初始值。如果没有第二个参数,会跳过第一次迭代,第二次迭代给叠加器传入数组的第一个元素。
见下面的例子,给 users
数组使用 reduce
方法,返回所有用户数组的和。为了简化,例子仅使用了回调函数的第一个参数和第二个参数。
const users = [
{ name: 'John', age: 34 },
{ name: 'Amy', age: 20 },
{ name: 'camperCat', age: 10 }
];
const sumOfAges = users.reduce((sum, user) => sum + user.age, 0);
console.log(sumOfAges); // 64
在另一个例子里,查看如何返回一个包含用户名称做为属性,其年龄做为值的对象。
const users = [
{ name: 'John', age: 34 },
{ name: 'Amy', age: 20 },
{ name: 'camperCat', age: 10 }
];
const usersObj = users.reduce((obj, user) => {
obj[user.name] = user.age;
return obj;
}, {});
console.log(usersObj); // { John: 34, Amy: 20, camperCat: 10 }
--instructions--
watchList
变量中包含一组存有多部电影信息对象。使用reduce
查找由Christopher Nolan 导演的电影的 IMDB 评级平均值。回想一下之前的挑战,如何filter
数据,以及使用map
来获取你想要的数据。你可能需要创建一些变量,但是请将最后的平均值保存到averageRating
变量中。请注意,评级在对象中是字符串,需要将其转换为数字再用于数学运算。
--hints--
watchList
应保持不变。
assert(
watchList[0].Title === 'Inception' && watchList[4].Director == 'James Cameron'
);
应该使用reduce
方法。
assert(code.match(/\.reduce/g));
TheaverageRating
应等于 8.675。
assert(getRating(watchList) === 8.675);
不能使用for
循环。
assert(!code.match(/for\s*?\(.*\)/g));
在修改 watchList
对象后应该返回正确的输出。
assert(getRating(watchList.filter((_, i) => i < 1 || i > 2)) === 8.55);