又见到数组方法了,在前面已经的多次写到过数组方法,甚至都使用原生方法重构了一遍数组的各个方法,可是随着数组方法reduce的应用,发现reduce真的是妙用无穷啊!还是很值得再拿出来说一遍的。
我们再看MDN上关于reduce的解释:

reduce() 方法对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。

示例也比较简单,是对数组求和:

const array1 = [1, 2, 3, 4];
const reducer = (accumulator, currentValue) => accumulator + currentValue;

console.log(array1.reduce(reducer));

console.log(array1.reduce(reducer, 5));

会给出两个示例,是基于reduce方法第二个参数是最为reduce所有计算的基础值的。
刚开始看、甚至重构了之后,都没怎么用过reduce,所以其实一直以来都没怎么真正明白怎么用,什么场景用?
最近在项目中刻意的寻找一些使用reduce的机会,多次使用之后,突然发现:哇,reduce原来这么🐂!
看一个使用场景

const summary = lineStatus.reduce((accu, curr) => {
     const sum = curr.HEAVYLOAD + curr.MEDIUMLOAD + curr.LIGHTLOAD
         return {
            HEAVYLOAD: accu.HEAVYLOAD + curr.HEAVYLOAD,
            MEDIUMLOAD: accu.MEDIUMLOAD + curr.MEDIUMLOAD,
            LIGHTLOAD: accu.LIGHTLOAD + curr.LIGHTLOAD,
            max: sum > accu.max ? sum : accu.max
        }
    }, { HEAVYLOAD: 0, MEDIUMLOAD: 0, LIGHTLOAD: 0, max: 0 })                

发现什么了么?我是在分别统计数组当中HEAVYLOAD、MEDIUMLOAD、LIGHTLOAD属性之和,并且计算了每一个元素中的HEAVYLOAD、MEDIUMLOAD、LIGHTLOAD三个属性之后的最大值。仅仅使用了一次reduce而已,是不是很强大?
再看一个使用场景:

 const data = arr.reduce((accu, curr) => {
    accu[0].push({
        actual: curr['TOTALNUM_20KV'],
        value: this.calcPercent(curr['TOTALNUM_20KV'], max)
    })
    accu[1].push({
        actual: curr['NUM_20KV'],
        value: this.calcPercent(curr['NUM_20KV'], max)
    })
    return accu
}, [[], []])

这次又干了什么呢?是分别统计了arr数组当中TOTALNUM_20KV属性值、和NUM_20KV属性值各自组成了一个数组,并且统一返回了所求的值。
看出点什么了不?
关键点在于reduce的基数值类型,我们可以做很多事情,但是关键点在于reduce的回调函数需要有返回值,而且必须要有返回值

posted on 2019-07-12 14:29  烛火星光  阅读(426)  评论(0编辑  收藏  举报