又见到数组方法了,在前面已经的多次写到过数组方法,甚至都使用原生方法重构了一遍数组的各个方法,可是随着数组方法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的回调函数需要有返回值,而且必须要有返回值。