语法
array.reduce(function(total, currentValue, currentIndex, arr), initialValue)
reduce 方法接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。
语法:
callback (执行数组中每个值的函数,包含四个参数)
1、total 必需 (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue 必需 (数组中当前被处理的元素)
3、currentIndex 可选 (当前元素在数组中的索引)
4、arr 可选 (调用 reduce 的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
例子
- 计算数组总和
var arr = [1, 2, 3, 4];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
console.log(arr, sum);
// [1, 2, 3, 4] 10
如果没有提供
initialValue
, reduce 会从索引1的地方开始执行callback
方法,跳过第一个索引。如果提供initialValue
,从提供的initialValue
值开始。
- 合并二维数组
var red = [[0, 1], [2, 3], [4, 5]].reduce(function(a, b) {
return a.concat(b);
}, []);
console.log(red)
// [0, 1, 2, 3, 4, 5]
这里提供了
initialValue
初始值 一个空数组[ ]
- 计算数组总和
注意:如果这个数组为空,运用reduce是什么情况?
var arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
})
//报错,"TypeError: Reduce of empty array with no initial value"
但是要是我们设置了初始值就不会报错
var arr = [];
var sum = arr.reduce(function(prev, cur, index, arr) {
console.log(prev, cur, index);
return prev + cur;
},0)
console.log(arr, sum); // [] 0
所以一般来说我们提供初始值通常更安全
- reduce的高级用法 计算数组中每个元素出现的次数
let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
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}
- reduce的高级用法 数组去重
let arr = [1,2,3,4,4,1]
let newArr = arr.reduce((pre,cur)=>{
if(!pre.includes(cur)){
return pre.concat(cur)
}else{
return pre
}
},[])
console.log(newArr);// [1, 2, 3, 4]