2012-04-13 14 views
9

Básicamente quiero expresar el siguiente comportamiento usando _.each() o _.map() en Underscore.js.¿Es posible iterar a través de dos listas al mismo tiempo en Underscore.js?

a = [1, 2, 3] 
b = [3, 2, 1] 

# Result list 
c = [0, 0, 0] 

for i in [0 .. a.length - 1] 
    c[i] = a[i] + b[i] 

Esto es definitivamente posible en Matlab (mi idioma principal) como tal:

c = arrayfun(@(x,y) x+y, a, b) 

Intuitivamente, se siente como la sintaxis de subrayado debe ser:

c = _.map(a, b, function(x, y){ return x + y;}) 

Sin embargo, ese lista de argumentos no es aceptable; el segundo parámetro se supone que es una función invocable.

El argumento opcional "context" no me ayudará en esta situación.

Respuesta

14

Use zip (también de underscore.js) para eso. Algo como esto:

var a = [1, 2, 3]; 
var b = [4, 5, 6]; 
var zipped = _.zip(a, b); 
// This gives you: 
// zipped = [[1, 4], [2, 5], [3, 6]] 

var c = _.map(zipped, function(pair) { 
    var first = pair[0]; 
    var second = pair[1]; 
    return first + second; 
}); 

// This gives you: 
// c = [5, 7, 9] 

Ejemplo de trabajo:

+1

Gracias una tonelada! Eso fue realmente útil. – mrjoelkemp

+0

¡Claro, me alegra ayudar! –

+0

@ icyrock.com Cuando reemplazo los valores en las matrices 'a' y' b' con ** Strings ** La función '_.zip' de Underscore almacena la ** longitud de la matriz ** en lugar del valor. ¿Puedes confirmar esto? ¿Cómo implementaría el mismo escenario pero con cadenas en lugar de números enteros? – JJD

Cuestiones relacionadas