共计 1145 个字符,预计需要花费 3 分钟才能阅读完成。
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
正文完
发表至: javascript
2021-03-23