【问题标题】:Why does the callback function for reduce take four parameters?为什么reduce的回调函数有四个参数?
【发布时间】:2015-10-01 06:23:10
【问题描述】:

在研究reduce方法时我不太清楚为什么传入的回调需要第三个和第四个参数,索引和数组。在来自 MDN 的示例中:

[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
  return previousValue + currentValue;
});

我研究过的数组reduce方法或下划线reduce函数的许多其他用途只使用callback的前两个参数:previousValue(有时被视为accumulator)和currentValue (又名elem,当前索引的值)。

为什么reduce有时用callback写四个参数,而有时只用previousValuecurrentValue写?

在什么情况下需要indexarray 参数?

如果reduce的应用程序需要第三个或第四个参数,是否应该在reduce的函数定义中始终给出所有四个参数?

【问题讨论】:

  • 不,没有必要总是提供所有 4 个参数,您可以只使用前 2 个参数,例如 function(previousValue, currentValue){}...

标签: javascript callback reduce optional-parameters


【解决方案1】:

这里是一个(稍微)不那么做作的例子,用于总结数组中的唯一值,跳过重复项,使用 indexarray 参数来查找唯一值:

[0, 1, 2, 3, 2, 1, 0].reduce(function(previousValue, currentValue, index, array) {
  return array.indexOf(currentValue) === index ? // value used already?
         previousValue + currentValue :  // not used yet, add to sum
         previousValue; // used already, skip currentValue
}); // == 6  ( 0+1+2+3 )

现场演示:http://pagedemos.com/fn764n659ama/1/

旁注:[].reduce() 在 V8 中通过将所有四个参数指定为回调的形式参数来运行得更快,无论它们是否被函数内部的代码使用。

【讨论】:

    【解决方案2】:

    如果您只需要使用前两个参数,那么在函数参数列表中保留后两个是完全可以的。在这种情况下,最后两个参数将被忽略。对数组求和,这是一种完全可以接受的方法:

    [0, 1, 2, 3, 4].reduce(function(previousValue, currentValue) {
      return previousValue + currentValue;
    });
    

    最后两个参数indexarray 只是为您提供额外信息以备不时之需。例如,假设您想将数组中的所有元素乘以它们的镜像元素相加,即给定数组[0, 1, 2, 3, 4]您要输出

    (0 * 4) + (1 * 3) + (2 * 2) + (3 * 1) + (4 * 0)
    

    那么你将不得不使用最后两个参数:

    [0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
      return previousValue + currentValue * array[array.length - index - 1];
    });
    

    诚然,这是一个有点做作的例子,但我很难想出一个看起来不做作的例子。无论如何,最后两个参数偶尔会派上用场。

    【讨论】:

      猜你喜欢
      • 2021-06-28
      • 1970-01-01
      • 2018-03-24
      • 1970-01-01
      • 2021-11-06
      • 2011-01-18
      • 2013-11-04
      • 2012-08-14
      • 2013-12-01
      相关资源
      最近更新 更多