在日常用到的数组遍历方法有forEach()、map()、filter()、reduce,这里单独说说reduce。
一、语法
var arr = [2,4,3,5,1];
arr.reduce(function(prev,cur,index,arr){
console.log(prev) //init的值或arr[0]
console.log(cur) //2,3,4,5
console.log(index) //1,2,3,4,5
console.log(arr) //2,4,3,5,1
}, init);
prev 表示上一次调用回调时的返回值,或者初始值 init;
cur 表示当前正在处理的数组元素;
index 表示当前正在处理的数组元素的索引,若提供 init 值,则索引为0,否则索引为1;
arr 表示原数组;
init 表示初始值。
Array.reduce(callback)
这个方法是根据callback中的条件对数组中的每个元素都进行类加的操作,返回一个全新的值
二、实例
1. 求数组项之和
let arr2= [1,2,3,4,5,2,3];
// 求数组之和
let sum = arr2.reduce(function(prev, cur){
return prev + cur;
},0);
console.log(sum); //20
//箭头函数写法
let b = a.reduce((i, j) => {
return i + j;
}, 0);
console.log(b) //20
由于传入了初始值0,所以开始时prev的值为0,cur的值为数组第一项1,相加之后返回值作为下一轮回调的prev值,然后再继续与下一个数组项相加
2. 求数组项最大值
let arr2= [1,2,3,4,5,2,3];
// 求数组最大值
let max = arr2.reduce(function(prev, cur){
return Math.max(prev, cur);
});
console.log(max);
// 箭头函数写法
let newArr2 = arr.reduce((pre,cur,curIndex,arr) => pre>cur?pre:cur)
//pre=1不大于cur=2,返回2;
//pre接收返回值2;pre=2不大于cur=3,返回3
console.log(newArr2) //输出4,找到最大值,如果想找最小值只需要pre<cur?pre:cur
由于未传入初始值,所以开始时prev的值为数组第一项,cur的值为数组第二项,取两值最大值后进入下一轮回调。
3. 数组去重
let arr2= [1,2,3,4,5,2,3];
let newArr = arr2.reduce(function(prev, cur){
if( prev.indexOf(cur) == -1){
prev.push(cur);
}
return prev;
},[]);
console.log(newArr); //[1,2,3,4,5]
实现的原理如下:
初始化一个空数组,将需要去重的数组的值在空数组里查找,如果找不到,就将这个值添加到空数组里,直到查找完毕,将空数组返回出来。
重点总结
reduce() 是数组的归并方法,与forEach()、map()、filter()等迭代方法一样都会对数组每一项进行遍历,但是reduce() 可同时将前面数组项遍历产生的结果与当前遍历项进行运算,这一点是其他迭代方法无法企及的