La concatenación de una matriz de matrices en CoffeeScript
-
08-10-2019 - |
Pregunta
Estoy tratando de encontrar una manera elegante en CoffeeScript 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].
Como se puede imaginar, necesito esto porque yo estoy generando matrices de una función en un "en el" constructo y necesidad de concatenar la matriz anidada resultante:
resultado = (generate_array (x) para x en arr)
¿Hay una manera elegante de manejar esto? Gracias por cualquier punteros!
Solución
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 ]
Otros consejos
OK, una forma es incluir el href="http://documentcloud.github.com/underscore/docs/underscore.html" rel="nofollow"> underscore.js biblioteca . Es un muy agradable, biblioteca utilidad ligera pero de gran alcance, y se ha _.flatten que hace exactamente esto.
Aparte de eso, usted podría tomar el código underscore.js para aplanar y modificarlo para quitar cualquier otras dependencias de subrayado para crear su propia independiente "aplanar".
Aquí está la underscore.js "_.flatten" código:
_.flatten = function(array) {
return _.reduce(array, function(memo, value) {
if (_.isArray(value)) return memo.concat(_.flatten(value));
memo[memo.length] = value;
return memo;
}, []);
};
Tenga en cuenta que se está haciendo algunas buenas cosas para usted. Por ejemplo, muchas de las funciones de subrayado como _.reduce comprobará para ver si el navegador ha implementado una versión nativa, que algunos tienen. Si es así, se utilizará el nativo que por supuesto corre mucho más rápido. La aplicación _.isArray hace lo mismo.
¿Qué hay de 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));
¿Por qué no tratar de usar Lodash?
_.flatten([1,2,3], [4,5,6]) => [1,2,3,4,5,6]