js 中 Array 对象上有很多提高开发效率的方法,reduce 是我之前用的最少的,今天看到一篇文章,讲到了 reduce 的一种应用场景,码者发挥了下想象力,翻译之余增加了点内容。
基本用法
reduce 在我之前的认知中,就是用来做累加或者累乘之类的操作的。比如下面求和的例子:
let arr = [1,2,3,4];
let sum = arr.reduce( (a, b) => a+b );
console.log(sum); // 10
我们可以给 reduce 方法设置一个初值:
let arr = [1];
let sum = arr.reduce( (a, b) => a+b, 100);
console.log(sum); // 101
复杂一点的数据结构:
let arr = [{num: 1}, {num: 2}, {num: 3}];
let sum = arr.reduce( (a, b) => ({
num: a.num+b.num
}));
console.log(sum); // 6
数组元素分类
有时候我们会需要把一个数组的元素分成几个数组,比如对于[1, 2, 3, 4, 0, -2]
这个数组,把正数放在一个数组里,把负数放在一个数组里,如果不用 reduce,我们可以这样:
let arr = [1,2,3,4,0,-2];
let nagetive=[], positive=[];
arr.forEach( item => {
if(item>0)
positive.push(item);
else
nagetive.push(item);
});
用 reduce 呢?
let arr = [1,2,3,4,0,-2];
let [nagetive, positive] = arr.reduce( (result, value) => {
if(value>0)
result[0].push(value);
else
result[1].push(value);
return result;
}, [[],[]]);
原本冗长的代码不仅没变得简洁,还变得难懂了?!
不过码者刚刚看到 reduce 这种用法时,还感觉这种用法好 nb 的样子,直到下笔写下上一行文字时,才发现,原来并没有什么好用的……………………………………不过不过不过,用来装 b 大概还算有点市场。
对不起!