ES5-Array-reduce/reduceRight

2019-06-10  本文已影响0人  chrisghb

参考文章:reduce(),reduceRight()

注意:使用reduce前要判断数组length>0,否则会抛异常

reduce方法和reduceRight方法依次处理数组的每个成员,最终累计为一个值。它们的差别是:

reduce方法和reduceRight方法的第一个参数都是一个回调函数。该函数接受以下四个参数。

  1. 累积变量,默认为数组的第一个成员(必须)
  2. 当前变量,默认为数组的第二个成员(必须)
  3. 当前位置(从0开始)(可选)
  4. 原数组(可选)

这四个参数之中,只有前两个是必须的,后两个则是可选的。

[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方法会报错。这时,加上第二个参数,就能保证总是会返回一个值。

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);
})
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的参数函数会将字符长度较长的那个数组成员,作为累积值。这导致遍历所有成员之后,累积值就是字符长度最长的那个成员。

上一篇下一篇

猜你喜欢

热点阅读