在研究reduce方法时,我不太清楚为什么传入的回调需要第三个和第四个参数,索引和数组。在MDN的示例中:
[0, 1, 2, 3, 4].reduce(function(previousValue, currentValue, index, array) {
return previousValue + currentValue;
});
数组减少方法或下划线缩减函数的许多其他用途我研究过只使用callback
的前两个参数:previousValue
(有时看作{{ 1}})和accumulator
(又名currentValue
,当前索引的值)。
为什么有时会使用elem
写入四个参数,有时只用callback
和previousValue
编写?
需要currentValue
和index
参数的情况是什么?
如果reduce的应用需要第三个或第四个参数,是否应该在函数定义中给出所有四个参数以进行reduce?
答案 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;
});
最后两个参数index
和array
只是为您提供额外信息,以备不时之需。例如,假设你想要总结数组中的所有元素乘以它们的镜像元素,也就是说,给定要输出的数组[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];
});
不可否认,这是一个有点人为的例子,但我很难想出一个似乎并不做作的例子。无论如何,最后两个参数偶尔会派上用场。