关于reduce的总结和理解

1、关于reduce

一个完整的reduce方法应该是这样

array.reduce(function(accumulator, currentValue, currentIndex, array), initialValue)

它由一个回调函数与一个初始值组成,其中函数接受四个参数

  1. initialValue 初始值
    表示reduce方法第一次执行时的初始值,是一个可选值
  2. accumulator 累加器
    它是reduce方法多次执行的累积结果,accumulator 的初始值分两种情况:
    若有提供initialValue 初始值,第一次循环时accumulator 的值便为initialValue,后续循环时accumulator 为上次循环的返回值
    若未提供初始值,第一次循环时累加器的值为数组的第一项arr[0](如果没有就为空),后续循环时为上次的返回值
  3. currentValue 当前值
    数组循环当前处理值的值,currentValue的初始值也受到初始值的影响
    若有提供初始值,第一次循环当前值的值为数组第一项arr[0],后续变化随索引递增变化
    若未提供初始值,第一次循环由于arr[0]成了累加器的值,所以当前值只能从arr[1]开始,后续变化随索引递增
  4. currentIndex 当前处理值的索引
    数组循环当前处理值的索引,currentValue 与 currentIndex是同步变化的。
  5. 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
},{})

![在这里插入图片描述](https://img-blog.csdnimg.cn/bb4f6a5ab36f40d5a8e86dfab6
(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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值