reduce() 方法接收一个函数作为累加器(accumulator),数组中的每个值(从左到右)开始缩减,最终为一个值。
reduce 为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值(或者上一次回调函数的返回值),当前元素,当前索引,调用 reduce 的数组。
arr.reduce(callback, [initialValue])
callback (执行数组中每个值的函数,包含四个参数)
- previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
- currentValue (数组中当前被处理的元素)
- index (当前元素在数组中的索引)
- array (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
举例子
某同学的期末成绩如下表示
const result = [
{
subject: 'math',
score: 88
},
{
subject: 'chinese',
score: 95
},
{
subject: 'english',
score: 80
}
];
如何求该同学的总成绩?
const sum = result.reduce((prev, cur) => {
return cur.score + prev;
}, 0);
假设该同学因为违纪被处罚在总成绩总扣10分,只需要将初始值设置为-10即可。
const sum = result.reduce((prev, cur) => {
return cur.score + prev;
}, -10);
假如该同学的总成绩中,各科所占的比重不同,分别为50%,30%,20%,我们应该如何求出最终的权重结果呢?
const dis = {
math: 0.5,
chinese: 0.3,
english: 0.2
};
const qsum = result.reduce((prev, cur) => {
return cur.score * dis[cur.subject] + prev;
}, 0);
再看一个例子,如何知道一串字符串中每个字母出现的次数?
const arrString = 'asdfjjfsfljfajfdjad';
arrString.split('').reduce((res, cur) => {
res[cur] ? res[cur]++ : res[cur] = 1;
return res;
}, {});