参考文章:JS数组reduce()方法详解及高级技巧 25个数组reduce高级用法
语法
arr.reduce(callback,[initialValue])
reduce为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接收四个参数:初始值(或者上一次回调函数的返回值),当前元素,当前索引,调用reduce的数组。
callback (执行数组中每个值的函数,包含四个参数)
1、previousValue (初始值是initialValue,后面就是上一次调用回调return返回的值)
2、currentValue (数组中当前被处理的元素)
3、index (当前元素currentValue在数组中的索引)
4、array (当前元素currentValue所属的数组)
initialValue (作为第一次调用 callback 的第一个参数。)
还可以有另一种理解:
reduce参数:
- callback: 回调函数
initValue: 初始值
回调函数的参数:
total: 累计器完成计算的返回值
- value: 当前元素的值
- index: 当前元素的索引
- array: 当前元素所属的数组对象
回调函数的过程(reduce函数中其实是隐藏着循环便利的,他会从数组第一个元素开始循环遍历)
- 以total作为累计结果的初始值(开始会把initValue赋值给t),如果不给值则以数组第一个元素为初始值,value从第二个元素开始。
- 开始遍历,使用累计器处理v,将v的映射结果累计到t上,结束此次循环,返回t
- 进入下一次循环,重复上述操作,直至数组最后一个元素
- 结束遍历,返回最终的t
简单用法
最简单的就是我们常用的数组求和,求乘积
var arr = [1, 2, 3, 4];
var sum = arr.reduce((x,y)=>x+y)
var mul = arr.reduce((x,y)=>x*y)
console.log( sum ); //求和,10
console.log( mul ); //求乘积,24
高级用法
计算数组中每个元素出现的次数
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}
将二维数组转化为一维数组
let arr = [[0, 1], [2, 3], [4, 5]]
let newArr = arr.reduce((pre,cur)=>{
return pre.concat(cur)
},[])
console.log(newArr); // [0, 1, 2, 3, 4, 5]
对象里的属性求和
var result = [
{
subject: 'math',
score: 10
},
{
subject: 'chinese',
score: 20
},
{
subject: 'english',
score: 30
}
];
var sum = result.reduce(function(prev, cur) {
return cur.score + prev;
}, 0);
console.log(sum) //60
记录数组中元素的索引
查找元素arr中值为val的,并将其装入新的数组里
function Position(arr = [], val) { // 记录数组元素的索引
return arr.reduce((t, v, i) => (v === val && t.push(i),t), []);
}
const reduceB = [2, 1, 5, 4, 2, 1, 6, 6, 7];
Position(reduceB, 2); // [0, 4]
注意:(v === val && t.push(i), t) 中涉及逗号表达式,就是执行完左边操作,返回逗号右边的值;是如下写法的简写;
v === val && t.push(i);
return t;