7

根据文档underscore-reduce我应该传递三个参数。

例如:

var m = _.reduce([1,2,3], function (memo, num) {return (num * 2) +memo }, 0);
m; // 12 as expected

如果我尝试只传递前两个参数,我会得到不同的值。为什么?

var m = _.reduce([1,2,3], function (memo, num) {return (num * 2) +memo });
m; // 11 ..why?
4

2 回答 2

6

只有两个参数传入reduce,它将使用第一个和第二个数组项作为第一个函数调用的参数。

function addDouble(memo, num) {return (num * 2) +memo }

[1,2,3].reduce(addDouble, 0)
// is equivalent to
addDouble(addDouble(addDouble(0, 1), 2), 3)

[1,2,3].reduce(addDouble)
// is equivalent to
addDouble(addDouble(1, 2), 3)

通常你会传递起始值,但许多操作在没有标识元素的情况下启动时会产生相同的结果。例如:

function add(a, b) { return a+b; }
function double(a) { return 2*a; }

[1,2,3].map(double).reduce(add) == [1,2,3].map(double).reduce(add, 0)

另请参阅nativereduce()的文档。

于 2012-08-01T13:21:42.777 回答
0

如果您只传递两个参数,则初始备忘录将采用数组的第一个值,并通过其余的。11 = 1 + (2 * 2) + (3*3)。这就是为什么。如果你传递三个参数,备忘录将把第三个参数作为初始meno,并遍历数组的每一项。

于 2014-01-10T19:41:35.077 回答