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