为什么reduce的回调函数需要四个参数?

时间:2015-07-13 05:07:57

标签: javascript callback reduce optional-parameters

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

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

数组减少方法或下划线缩减函数的许多其他用途我研究过只使用callback的前两个参数:previousValue(有时看作{{ 1}})和accumulator(又名currentValue,当前索引的值)。

为什么有时会使用elem写入四个参数,有时只用callbackpreviousValue编写?

需要currentValueindex参数的情况是什么?

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

2 个答案:

答案 0 :(得分:2)

这是一个(稍微)设计较少的例子,用于总结数组中的唯一值,跳过重复项,使用索引数组参数来查找唯一值:

[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/

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

答案 1 :(得分:1)

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

[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];
});

不可否认,这是一个有点人为的例子,但我很难想出一个似乎并不做作的例子。无论如何,最后两个参数偶尔会派上用场。