arr.reduce(callBack(sumVal,curVal,index,arr),initValue);
·如果有initValue,则根据数值类型进行计算,
如果未填写initValue,则初始值为数组的第1项,从数组的第2项进行计算,循环次数减1。
·callBack有四个参数(preVal,curVal,index,arr)即(上次返回的值,当前元素,索引,原数组)

let sum = arr.reduce((sumVal,curVal,index,arr)=>{
  console.log(sumVal,curVal,index,arr);
  return sumVal+curVal;
})
// 输出
1 2 1 [1,2,3,4]
3 3 2 [1,2,3,4]
6 4 3 [1,2,3,4]

·如果填写initValue,则会从数组的第一个元素开始循环

let sum = arr.reduce((sumVal,curVal,index,arr)=>{
  console.log(sumVal,curVal,index,arr);
  return sumVal+curVal;
},0)
// 输出
0 1 0 [1,2,3,4]
1 2 1 [1,2,3,4]
3 3 2 [1,2,3,4]
6 4 3 [1,2,3,4]

tips:如果不填写initValue,当数组为空时会报错,因为初始循环时,数组中找不到元素,sumVal无法定义,所以在使用reduce时,加上initValue更安全。

·简写reduce

var sum = arr.reduce((x,y) => x+y)

上例就是求数组之和,当函数体只有一个表达式时,可以省略{}与return。

·initValue可以是基本类型,也可以是一个数组或一个对象, 举例:
1、计算数组中每个元素出现的次数

    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}

2、数组去重

    let sum = arr.reduce((x,y)=>{
        if(!x.includes(y)){
            x.push(y);
        }
        return x;
    },[])
    console.log(sum); //[1,2,5,4]

3、对象求和

        {
            subject: 'math',
            score: 10
        },
        {
            subject: 'chinese',
            score: 20
        },
        {
            subject: 'english',
            score: 30
        }
    ];
    var sum = arr.reduce(function(x, y) {
        return y.score + x;
    }, 0);
    console.log(sum); //60

亚洲友人
1 声望0 粉丝

研究研究🍌🍎🍐