1、关于reduce
一个完整的reduce方法应该是这样
array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)
它由一个回调函数与一个初始值组成,其中函数接受四个参数
- initialValue 初始值
表示reduce方法第一次执行时的初始值,是一个可选值 - accumulator 累加器
它是reduce方法多次执行的累积结果,accumulator 的初始值分两种情况:
若有提供initialValue 初始值,第一次循环时accumulator 的值便为initialValue,后续循环时accumulator 为上次循环的返回值
若未提供初始值,第一次循环时累加器的值为数组的第一项arr[0](如果没有就为空),后续循环时为上次的返回值 - currentValue 当前值
数组循环当前处理值的值,currentValue的初始值也受到初始值的影响
若有提供初始值,第一次循环当前值的值为数组第一项arr[0],后续变化随索引递增变化
若未提供初始值,第一次循环由于arr[0]成了累加器的值,所以当前值只能从arr[1]开始,后续变化随索引递增 - currentIndex 当前处理值的索引
数组循环当前处理值的索引,currentValue 与 currentIndex是同步变化的。 - array
当前正在被循环的数组
由于reduce是一个对数组累积操作的方法,在使用中一定记得加return 返回累积操作的数据
如果reduce有提供初始值,则循环从索引0开始,此时accumulator就是initialValue,currentValue值就是arr[0];如果reduce未提供初始值,则arr[0]作为初始值赋予给accumulator,循环从索引1开始,currentValue值就是arr[1]了;
2、 reduce作用
reduce 简单的用法 就是我们常用的数组求和,求乘积了。
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
假设我们希望求数字90与数组 [ 1,2,3,4] 元素的和呢,那就这么写:
let total = [1, 2, 3, 4].reduce((accumulator, current) => accumulator += current, 90); // 100
reduce的高级用法
(1)计算数组中每个元素出现的次数
let arr = [1,2,3,4,5,6,8,5,6,5,5,5]
let arrNum = arr.reduce((acc,cur)=>{
if(cur in acc){
acc[cur]++ //acc[cur]表示cur对应的value
}else{
acc[cur]=1
}
return acc
},{})
(2) 数组去重
let arr = [2,3,4,3,4,,5]
let newArr = arr.reduce((acc,cur)=>{
if(!acc.includes(cur)){
return acc.concat(cur)
}else{
return acc
}
},[])
console.log(newArr,'newArr')
(3)数组降维
将二位数组转化为一维数组
let arr = [[0,1],[1,2],[3,4]]
let newArr = arr.reduce((acc,cur)=>{
return acc.concat(cur)
},[])
console.log(newArr,'newArr')
将多维数组转化为一维
let arr = [[0,1],[2,3],[4,[5,6,7]],[8,[10,[11,12,13]]]]
let newArr = function(arr){
return arr.reduce((acc,cur)=>{
return acc.concat(Array.isArray(cur)? newArr(cur):cur)
},[])
}
newArr(arr)
(4)对象里的属性求和
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
使用注意
在使用reduce()方法有一点注意,若有初始值但数组为空,或无初始值但数组只有一项时,reduce方法都不会执行
[].reduce(() => console.log(1), 1); //不会执行
[1].reduce(() => console.log(1)); //不执行
若数组为空且没有初始值,reduce方法报错。
[].reduce(() => console.log(1)); //报错
所以如果没有初始值,你至少得保证数组有2项才能执行;如果给了初始值,你至少得保证数组有一项才能执行。
[1, 2].reduce(() => console.log(1)); //1
[1].reduce(() => console.log(1), 1); //1