¿Cuál es la forma más eficiente de concatenar N matrices de objetos en JavaScript?
Las matrices son mutables y el resultado puede almacenarse en una de las matrices de entrada.
javascript
arrays
Leonid
fuente
fuente
Respuestas:
Si está concatenando más de dos matrices, este
concat()
es el camino a seguir para mayor comodidad y rendimiento probable.Para concatenar solo dos matrices, el hecho de que
push
acepta múltiples argumentos que consisten en elementos para agregar a la matriz se puede usar en su lugar para agregar elementos de una matriz al final de otra sin producir una nueva matriz. Conslice()
esto también se puede usar en lugar de,concat()
pero parece que no hay una ventaja de rendimiento al hacerlo .En ECMAScript 2015 y versiones posteriores, esto se puede reducir aún más a
Sin embargo, parece que para matrices grandes (del orden de 100,000 miembros o más), la técnica que pasa una matriz de elementos
push
(ya sea usandoapply()
o el operador de propagación ECMAScript 2015) puede fallar. Para tales matrices, usar un bucle es un mejor enfoque. Consulte https://stackoverflow.com/a/17368101/96100 para más detalles.fuente
a.concat(b)
caso de prueba parece estar haciendo innecesariamente una copia de la matriz ya
luego tirarla.concat()
que generalmente es más rápido. Para el caso de concatenar una matriz en una matriz existente en su lugar,push()
es el camino a seguir. Actualicé mi respuesta.editar : prueba de eficiencia: http://jsperf.com/multi-array-concat/7
edit2 : Tim Supinie menciona en los comentarios que esto puede causar que el intérprete exceda el tamaño de la pila de llamadas. Esto quizás dependa del motor js, pero también obtuve el "Tamaño máximo de pila de llamadas excedido" en Chrome al menos. Caso de prueba:
[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (También recibí el mismo error al usar la respuesta actualmente aceptada, por lo que uno está anticipando tales casos de uso o construyendo una biblioteca para otros, puede ser necesario realizar pruebas especiales sin importar la solución que elija).fuente
Para personas que usan ES2015 (ES6)
Ahora puede usar la sintaxis de propagación para concatenar matrices:
fuente
El
concat()
método se usa para unir dos o más matrices. No cambia las matrices existentes, solo devuelve una copia de las matrices unidas.fuente
concat
se usa específicamente para crear nuevas matrices sin mutar la matriz original. Si desea actualizararray1
, tendría que usararray1.push(...array2, ...array3, ...array4)
Use Array.prototype.concat.apply para manejar la concatenación de múltiples matrices:
Ejemplo:
fuente
Si está en medio de canalizar el resultado a través de map / filter / sort, etc. y desea concatenar una matriz de matrices, puede usar
reduce
fuente
Para una matriz de múltiples matrices y ES6, use
Por ejemplo:
fuente
newArr = Array.from(new Set(newArr));
.any[]
? El tipeo está ahí, raro.[].concat.apply([], ...arr)
funciona mucho mejor en grandes volúmenes.Ahora podemos combinar múltiples matrices usando
ES6
Spread
. En lugar de usarconcat()
para concatenar matrices, intente usar la sintaxis extendida para combinar múltiples matrices en una matriz aplanada. p.ej:fuente
resuelto así.
fuente
Puede usar el sitio jsperf.com para comparar el rendimiento. Aquí hay un enlace a concat .
Comparación agregada entre:
y:
El segundo es casi 10 veces más lento en cromo.
fuente
push.apply()
, que parece ser más rápido queconcat()
en todos los navegadores, excepto Chrome. Mira mi respuesta.Fácilmente con la función concat:
fuente
Aquí hay una función por la cual puede concatenar múltiples números de matrices
Ejemplo
saldrá
fuente
Combinar matriz con Push:
Usando el operador Concat y Spread:
fuente
Si tiene una matriz de matrices y desea concatenar los elementos en una sola matriz, intente con el siguiente código (Requiere ES2015):
O si te gusta la programación funcional
O incluso mejor con la sintaxis ES5, sin el operador de propagación
Este camino es útil si no sabes el no. de matrices en el momento del código.
fuente
Acortar con ES6.
Esto hace concat y único los múltiples arreglos;
Demo en codepen
fuente
new Set()
elimina elementos duplicados. Solo quítalo.[].concat(...Array)
donde 'n' es un número de matrices, tal vez una matriz de matrices. . .
var answer = _.reduce (n, function (a, b) {return a.concat (b)})
fuente
Si solo hay dos matrices para concat, y en realidad necesita agregar una de ellas en lugar de crear una nueva, el camino a seguir es push o loop.
Punto de referencia: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/
fuente
prueba esto:
fuente
si las matrices N se obtienen de la base de datos y no están codificadas, lo haré así usando ES6
fuente