2012-08-01 50 views
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? 

回答

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) 

通常你会没有他们的identity element开始时传递开始值,但很多操作有同样的结果。例如:

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) 

另请参阅native reduce()的文档。

0

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