2012-08-01 12 views
7

Según la documentación underscore-reduce debería pasar tres parámetros.subrayar reducir, acerca de la nota

Por ejemplo:

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

Si trato de pasar sólo los primeros dos parámetros consigo un valor diferente. ¿Por qué?

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

Respuesta

6

Con sólo dos parámetros pasados ​​en reduce, se utilizará el primer y segundo elementos de matriz como argumentos a la primera llamada a la función.

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) 

lo general, se pasará el valor de inicio, pero muchas operaciones tienen el mismo resultado cuando se inicia sin su identity element. Por ejemplo:

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) 

Consulte también los documentos para native reduce().

0

Si acaba de pasar dos parámetros, la nota inicial tomará el primer valor de la matriz y pasará por el resto. 11 = 1 + (2 * 2) + (3 * 3). esta es la razón por. Y si pasa tres parámetros, la nota tomará el tercer parámetro como menú inicial y revisará cada elemento de la matriz.