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