注意:使用reduce前要判断数组length>0,否则会抛异常
reduce
方法和reduceRight
方法依次处理数组的每个成员,最终累计为一个值。它们的差别是:
-
reduce
是从左到右处理(从第一个成员到最后一个成员) -
reduceRight
则是从右到左(从最后一个成员到第一个成员,也就是将数组倒序排列后当reduce
处理),其他完全一样。
reduce
方法和reduceRight
方法的第一个参数都是一个回调函数。该函数接受以下四个参数。
- 累积变量,默认为数组的第一个成员(必须)
- 当前变量,默认为数组的第二个成员(必须)
- 当前位置(从0开始)(可选)
- 原数组(可选)
这四个参数之中,只有前两个是必须的,后两个则是可选的。
[1, 2, 3, 4, 5].reduce(function (a, b) {
console.log(a, b);
return a + b;
})
// 1 2
// 3 3
// 6 4
// 10 5
//最后结果:15
上面代码中,reduce
方法求出数组所有成员的和。
第一次执行,a
是数组的第一个成员1,b
是数组的第二个成员2。
第二次执行,a
为上一轮的<font color=red>返回值</font>
3,b
为第三个成员3。
第三次执行,a
为上一轮的返回值6,b
为第四个成员4。
第四次执行,a
为上一轮返回值10,b
为第五个成员5。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值15。
- 注意:如果数组只有一个元素,回调函数不执行,直接返回数组里面的元素。
如果要对累积变量指定初值,可以把它放在
reduce
方法和reduceRight
方法的第二个参数(相当于对数组unshift
一个元素)。
[1, 2, 3, 4, 5].reduce(function (a, b) {
return a + b;
}, 10);
// 25
上面代码指定参数a
的初值为10,所以数组从10开始累加,最终结果为25。注意,这时b
是从数组的第一个成员"1"开始遍历。
上面的第二个参数相当于设定了默认值,处理空数组时很有用。
function add(prev, cur) {
return prev + cur;
}
[].reduce(add)
// TypeError: Reduce of empty array with no initial value
[].reduce(add, 1)
// 1
上面代码中,由于空数组取不到初始值,reduce
方法会报错。这时,加上第二个参数,就能保证总是会返回一个值。
- 有了
reduce
,我们可以结合concat
轻松实现二维数组的扁平化:
var matrix = [
[1, 2],
[3, 4],
[5, 6]
];
// 二维数组扁平化
var flatten = matrix.reduce(function (previous, current) {
return previous.concat(current);
});
console.log(flatten); // [1, 2, 3, 4, 5, 6]
扁平化另一种实现方式:
var matrix = [
[1, 2],
[3, 4],
[5, 6]
];
let rlt = [];
matrix.foreach(dics=>{
rlt.push(...dics);
})
-
reduce
实现取数组中的最大值:
arr = [3, 9, 6];
var max = arr.reduce(function(x, y) {
console.log(x + "|" + y);
return x > y ? x : y;
});
// 3|9
// 9|6
max; // 9
下面是一个reduceRight
方法的例子。
function substract(prev, cur) {
return prev - cur;
}
[3, 2, 1].reduce(substract) // 0
[3, 2, 1].reduceRight(substract) // -4
上面代码中,reduce
方法相当于3减去2再减去1,reduceRight
方法相当于1减去2再减去3。
由于这两个方法会遍历数组,所以实际上还可以用来做一些遍历相关的操作。比如,找出字符长度最长的数组成员。
function findLongest(entries) {
return entries.reduce(function (longest, entry) {
return entry.length > longest.length ? entry : longest;
}, '');
}
findLongest(['aaa', 'bb', 'c']) // "aaa"
上面代码中,reduce
的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。
网友评论