2011-01-08 16 views
23

Estoy tratando de encontrar una forma elegante en Coffeescript para fusionar una matriz de matrices, de modo que [[1,2,3], [4,5,6], [7, 8,9]] ==> [1,2,3,4,5,6,7,8,9].Concatenar una matriz de matrices en Coffeescript

Como se puede imaginar, necesito esto porque estoy generación de matrices de una función en un "en el" construir y necesitan para concatenar la matriz anidada resultante:

resultado = (generate_array (x) para x en arr)

¿Hay una forma elegante de manejar esto? Gracias por cualquier punteros!

Respuesta

47

sólo tiene que utilizar el lenguaje JS:

[].concat.apply([], a) 

que se convierte en un poco más agradable en el café:

$ coffee -e 'a = [[1,2,3],[4,5,6],[7,8,9]]; console.dir [].concat a...' 
[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ] 
+0

agradable. No sabía que sería tan breve. Gracias. –

+0

esa expresión es brillante- ¡Gracias por informarme de esto! – drcode

+11

Para aquellos como yo que no lo entienden de inmediato, el segundo argumento de 'apply' es una lista donde cada elemento de la lista se convierte en un argumento pasado a la función. Entonces para [[1, 2, 3], [4, 5, 6], [7, 8, 9]] usted está llamando esencialmente [] .concat ([1,2,3], [4,5,6 ], [7,8,9]). –

5

OK, una forma es incluir la biblioteca underscore.js. Es una biblioteca de utilidades muy agradable, liviana pero potente, y tiene _.flatten que hace exactamente esto.

Al margen de eso, puede tomar el código underscore.js para aplanar y modificarlo para eliminar cualquier otra dependencia de subrayado para crear su propia "aplanar" independiente.

Aquí está el "_.flatten" código underscore.js:

_.flatten = function(array) { 
    return _.reduce(array, function(memo, value) { 
    if (_.isArray(value)) return memo.concat(_.flatten(value)); 
    memo[memo.length] = value; 
    return memo; 
    }, []); 
}; 

en cuenta que se está haciendo algunas buenas cosas para usted. Por ejemplo, muchas de las funciones de guión bajo como _.reduce verifican si el navegador ha implementado una versión nativa, que algunos tienen. Si es así, utilizará el nativo que, por supuesto, corre mucho más rápido. La implementación _.isArray hace lo mismo.

5

¿Y esto para café

[[1, 2, 3], [4, 5, 6], [7, 8, 9]].reduce (a, b) -> 
    a.concat b 

o esto por pura Javascript

[[1, 2, 3], [4, 5, 6], [7 , 8, 9]].reduce((a, b) => a.concat(b)); 
+1

'.reduce (a, b) -> [a ..., b ...]' es coffier – fracz

Cuestiones relacionadas