reduce() 是 ECMAScript 5 (ES5)中新增的数组方法。
可以用于求数组中所有元素的和、求数组中所有元素的乘积、找到数组中的最大值或最小值、将二维数组转为一维数组、将数组中的元素合并成一个字符串、对数组中的对象进行分组或排序等操作。
1、语法
arr.reduce(callback, [initialValue])
其中回调函数callback有四个参数:
1、previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))
2、currentValue (数组中当前被处理的元素)
3、index (当前元素在数组中的索引)
4、array (调用 reduce 的数组)
如果没有提供initialValue,reduce会从索引1的地方开始执行callback方法,跳过第一个索引。如果提供initialValue,从索引0开始。
例如:
//无初始值initialValue
const arr = [1, 2, 3, 4];
const sum = arr.reduce((prev, cur, index, arr) => {console.log(prev, cur, index);return prev + cur;
})
console.log(arr, sum);//打印结果:
//1 2 1
//3 3 2
//6 4 3
//[1, 2, 3, 4] 10
//有初始值initialValue
const arr = [1, 2, 3, 4];
const sum = arr.reduce((prev, cur, index, arr) => {console.log(prev, cur, index);return prev + cur;
},0) //注意这里设置了初始值
console.log(arr, sum);//打印结果:
//0 1 0
//1 2 1
//3 3 2
//6 4 3
//[1, 2, 3, 4] 10
2、利用reduce() 进行数组求和,求乘积
const arr = [1, 2, 3, 4];
const sum = arr.reduce((x,y) => x+y)
const mul = arr.reduce((x,y) => x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘积,24
3、利用reduce()统计数组中每个元素出现的次数
const names = ['A', 'B', 'C', 'D', 'A'];const nameNum = names.reduce((pre,cur) => {if(cur in pre) {pre[cur]++} else {pre[cur] = 1 }return pre
},{})
console.log(nameNum); //{A: 2, B: 1, C: 1, D: 1}
4、利用reduce() 进行数组去重
let hash = {};function unique(arr, initialValue){return arr.reduce(function(previousValue, currentValue, index, array){hash[currentValue.name] ? '' : hash[currentValue.name] = true && previousValue.push(currentValue);return previousValue}, initialValue);
}const uniqueArr = unique([{name: 'zs', age: 15}, {name: 'lisi'}, {name: 'zs'}], []);console.log(uniqueArr); // uniqueArr.length == 2
5、利用reduce() 进行数组降维
const arr = [[0, 1], [2, 3], [4, 5]]
const newArr = arr.reduce((pre,cur) => {return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
6、利用reduce() 进行对象的属性求和
const result = [{subject: '语文',score: 90},{subject: '数学',score: 90},{subject: '英语',score: 100}
];const sum = result.reduce((prev, cur) => {return cur.score + prev;
}, 0);
console.log(sum) //280