arr.reduce(callBack(sumVal,curVal,index,arr),initValue);
·如果有initValue,则根据数值类型进行计算,
如果未填写initValue,则初始值为数组的第1项,从数组的第2项进行计算,循环次数减1。
·callBack有四个参数(preVal,curVal,index,arr)即(上次返回的值,当前元素,索引,原数组)
let sum = arr.reduce((sumVal,curVal,index,arr)=>{
console.log(sumVal,curVal,index,arr);
return sumVal+curVal;
})
// 输出
1 2 1 [1,2,3,4]
3 3 2 [1,2,3,4]
6 4 3 [1,2,3,4]
·如果填写initValue,则会从数组的第一个元素开始循环
let sum = arr.reduce((sumVal,curVal,index,arr)=>{
console.log(sumVal,curVal,index,arr);
return sumVal+curVal;
},0)
// 输出
0 1 0 [1,2,3,4]
1 2 1 [1,2,3,4]
3 3 2 [1,2,3,4]
6 4 3 [1,2,3,4]
tips:如果不填写initValue,当数组为空时会报错,因为初始循环时,数组中找不到元素,sumVal无法定义,所以在使用reduce时,加上initValue更安全。
·简写reduce
var sum = arr.reduce((x,y) => x+y)
上例就是求数组之和,当函数体只有一个表达式时,可以省略{}与return。
·initValue可以是基本类型,也可以是一个数组或一个对象, 举例:
1、计算数组中每个元素出现的次数
let nameNum = names.reduce((pre,cur)=>{
if(cur in pre){
pre[cur]++
}else{
pre[cur] = 1
}
return pre
},{})
console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
2、数组去重
let sum = arr.reduce((x,y)=>{
if(!x.includes(y)){
x.push(y);
}
return x;
},[])
console.log(sum); //[1,2,5,4]
3、对象求和
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
{
subject: 'english',
score: 30
}
];
var sum = arr.reduce(function(x, y) {
return y.score + x;
}, 0);
console.log(sum); //60