一文学会数组的reduce()和reduceRight()

reduce()方法和reduceRight()方法依次处理数组的每个成员,最终累计为一个值。
它们的差别是,reduce()是从左到右处理reduceRight()则是从右到左,其他完全一样。

[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()方法用来求出数组所有成员的和。reduce()的参数是一个函数,数组每个成员都会依次执行这个函数。如果数组有 n 个成员,这个参数函数就会执行 n - 1 次。

  • 第一次执行:a是数组的第一个成员1,b是数组的第二个成员2。
  • 第二次执行:a为上一轮的返回值3,b为第三个成员3。
  • 第三次执行:a为上一轮的返回值6,b为第四个成员4。
  • 第四次执行:a为上一轮返回值10,b为第五个成员5。至此所有成员遍历完成,整个方法的返回值就是最后一轮的返回值15。

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

  1. 累积变量。第一次执行时,默认为数组的第一个成员;以后每次执行时,都是上一轮的返回值。
  2. 当前变量。第一次执行时,默认为数组的第二个成员;以后每次执行时,都是下一个成员。
  3. 当前位置。一个整数,表示第二个参数(当前变量)的位置,默认为1。
  4. 原数组。

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

[1, 2, 3, 4, 5].reduce(function (
  a,   // 累积变量,必须
  b,   // 当前变量,必须
  i,   // 当前位置,可选
  arr  // 原数组,可选
) {
  // ... ...

如果要对累积变量指定初值,可以把它放在reduce()方法和reduceRight()方法的第二个参数

[1, 2, 3, 4, 5].reduce(function (a, b) {
  return a + b;
}, 10);
// 25

上面代码指定参数a的初值为10,所以数组从10开始累加,最终结果为25。注意,这时b是从数组的第一个成员开始遍历,参数函数会执行5次。

建议总是加上第二个参数,这样比较符合直觉,每个数组成员都会依次执行reduce()方法的参数函数。

你可能感兴趣的:(js,javascript,开发语言,ecmascript)