美文网首页
ES5-Array-reduce/reduceRight

ES5-Array-reduce/reduceRight

作者: chrisghb | 来源:发表于2019-06-10 22:21 被阅读0次

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

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

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

  • reduce是从左到右处理(从第一个成员到最后一个成员)
  • reduceRight则是从右到左(从最后一个成员到第一个成员,也就是将数组倒序排列后当reduce处理),其他完全一样。

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

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

相关文章

网友评论

      本文标题:ES5-Array-reduce/reduceRight

      本文链接:https://www.haomeiwen.com/subject/elhxfctx.html