根据文档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?
答案 0 :(得分: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()
的文档。
答案 1 :(得分:0)
如果您只传递两个参数,初始备忘录将采用数组的第一个值,然后通过其余参数。 11 = 1 +(2 * 2)+(3 * 3)。这就是为什么。 如果你传递三个参数,备忘录将把第三个参数作为初始meno并遍历数组的每个项目。