Tengo una matriz de JavaScript dataArray
que quiero insertar en una nueva matriz newArray
. Excepto que no quiero newArray[0]
serlo dataArray
. Quiero insertar todos los elementos en la nueva matriz:
var newArray = [];
newArray.pushValues(dataArray1);
newArray.pushValues(dataArray2);
// ...
o mejor:
var newArray = new Array (
dataArray1.values(),
dataArray2.values(),
// ... where values() (or something equivalent) would push the individual values into the array, rather than the array itself
);
Entonces, la nueva matriz contiene todos los valores de las matrices de datos individuales. ¿Hay alguna abreviatura como pushValues
disponible para que no tenga que iterar sobre cada individuo dataArray
, agregando los elementos uno por uno?
javascript
arrays
bba
fuente
fuente
Respuestas:
Use la función concat , así:
El valor de
newArray
será[1, 2, 3, 4]
(arrayA
yarrayB
permanecerá sin cambios;concat
crea y devuelve una nueva matriz para el resultado).fuente
Google Chrome
: rápido (concat = ganador)Opera
,: rápido (concat = ganador) ,:IE
más lento (concat = ganador)Firefox
,: lento (push.apply = ganador, pero 10 veces más lento que el concat de Chrome) ... habla de una mala implementación del motor JS .push
no aplana una matriz de valores.concat
logra lo que la pregunta requiere.Siempre que sus matrices no sean enormes (vea la advertencia a continuación), puede usar el
push()
método de la matriz a la que desea agregar valores.push()
puede tomar múltiples parámetros para que pueda usar suapply()
método para pasar la matriz de valores que se empujará como una lista de parámetros de función. Esto tiene la ventaja sobre el usoconcat()
de agregar elementos a la matriz en su lugar en lugar de crear una nueva matriz.Sin embargo, parece que para matrices grandes (del orden de 100,000 miembros o más), este truco puede fallar . Para tales matrices, usar un bucle es un mejor enfoque. Consulte https://stackoverflow.com/a/17368101/96100 para más detalles.
Es posible que desee generalizar esto en una función:
... o agregarlo al
Array
prototipo:... o emule el
push()
método original al permitir múltiples parámetros utilizando el hecho de queconcat()
, al igual quepush()
, permite múltiples parámetros:Aquí hay una versión del último ejemplo basada en bucles, adecuada para matrices grandes y todos los principales navegadores, incluido IE <= 8:
fuente
newArray.push.apply(newArray, dataArray1);
da lo mismo queArray.prototype.push.applay(newArray,dataArra1);
Array.prototype.concat
no es malo, sino que simplemente se malinterpreta y a veces se usa mal. En estas circunstancias, solo se entiende mal, pero no se usa mal.Agregaré una respuesta más "a prueba de futuro"
En ECMAScript 6, puede usar la sintaxis Spread :
La sintaxis extendida aún no se incluye en todos los principales navegadores. Para conocer la compatibilidad actual, consulte esta tabla de compatibilidad (actualizada continuamente) .
Sin embargo, puede usar la sintaxis de propagación con Babel.js .
editar:
Vea la respuesta de Jack Giffin a continuación para obtener más comentarios sobre el rendimiento. Parece que concat sigue siendo mejor y más rápido que el operador extendido.
fuente
newArray.apply(newArray, dataArray1)
.Encontrado una manera elegante de MDN
O puede usar la
spread operator
función de ES6:fuente
¿Eso resuelve tu problema?
fuente
Lo siguiente me parece más simple:
Como "push" toma un número variable de argumentos, puede usar el
apply
método de lapush
función para empujar todos los elementos de otra matriz. Construye una llamada para empujar usando su primer argumento ("newArray" aquí) como "this" y los elementos de la matriz como los argumentos restantes.El
slice
en la primera declaración obtiene una copia de la primera matriz, por lo que no la modifica.Actualización Si está utilizando una versión de javascript con rebanada disponible, puede simplificar la
push
expresión para:fuente
La siguiente función no tiene problemas con la longitud de las matrices y funciona mejor que todas las soluciones sugeridas:
desafortunadamente, jspref se niega a aceptar mis envíos, así que aquí están los resultados usando benchmark.js
dónde
para loop y push es:
Presione Aplicar:
operador de propagación:
y finalmente el 'set length and for loop' es la función anterior
fuente
𝗥𝗲𝘀𝗲𝗮𝗿𝗰𝗵 𝗔𝗻𝗱 𝗥𝗲𝘀𝘂𝗹𝘁𝘀
Para los hechos, se realiza una prueba de rendimiento en jsperf y se comprueban algunas cosas en la consola. Para la investigación, se utiliza el sitio web irt.org . A continuación se muestra una colección de todas estas fuentes juntas más una función de ejemplo en la parte inferior.
Como se vio anteriormente, diría que Concat es casi siempre el camino a seguir para el rendimiento y la capacidad de retener la escasez de matrices de repuesto. Luego, para los me gusta de la matriz (como las listas DOMNodeLists
document.body.children
), recomendaría usar el bucle for porque es el segundo método más eficaz y el único otro método que retiene las matrices dispersas. A continuación, repasaremos rápidamente qué se entiende por matrices dispersas y me gusta de matrices para aclarar la confusión.𝗧𝗵𝗲 𝗙𝘂𝘁𝘂𝗿𝗲
Al principio, algunas personas pueden pensar que esto es una casualidad y que los proveedores de navegadores eventualmente llegarán a optimizar Array.prototype.push para ser lo suficientemente rápido como para vencer a Array.prototype.concat. ¡INCORRECTO! Array.prototype.concat siempre será más rápido (al menos en principio) porque es un simple copiar y pegar sobre los datos. A continuación, se muestra un diagrama visual simplificado de cómo se vería una implementación de matriz de 32 bits (tenga en cuenta que las implementaciones reales son MUCHO más complicadas)
Como se ve arriba, todo lo que necesita hacer para copiar algo así es casi tan simple como copiarlo byte por byte. Con Array.prototype.push.apply, es mucho más que un simple copiar y pegar sobre los datos. El ".apply" tiene que verificar cada índice en la matriz y convertirlo en un conjunto de argumentos antes de pasarlo a Array.prototype.push. Luego, Array.prototype.push tiene que asignar adicionalmente más memoria cada vez, y (para algunas implementaciones de navegador) incluso puede recalcular algunos datos de búsqueda de posición por escasez.
Una forma alternativa de pensar es esto. La matriz de origen es una gran pila de papeles grapados entre sí. La matriz de origen dos también es otra gran pila de papeles. ¿Sería más rápido para ti
En la analogía anterior, la opción # 1 representa Array.prototype.concat mientras que # 2 representa Array.prototype.push.apply. Probemos esto con un JSperf similar que solo difiere en que este prueba los métodos sobre matrices dispersas, no sobre matrices sólidas. Uno puede encontrarlo aquí mismo .
Por lo tanto, descarto mi caso de que el futuro del rendimiento para este caso de uso en particular no radica en Array.prototype.push, sino en Array.prototype.concat.
𝗖𝗹𝗮𝗿𝗶𝗳𝗶𝗰𝗮𝘁𝗶𝗼𝗻𝘀
𝗦𝗽𝗮𝗿𝗲 𝗔𝗿𝗿𝗮𝘆𝘀
Cuando ciertos miembros de la matriz simplemente faltan. Por ejemplo:
Alternativamente, javascript le permite inicializar matrices de repuesto fácilmente.
𝗔𝗿𝗿𝗮𝘆-𝗟𝗶𝗸𝗲𝘀
Un tipo de matriz es un objeto que tiene al menos una
length
propiedad, pero no se inicializó connew Array
o[]
; Por ejemplo, los siguientes objetos se clasifican como tipo matriz.Observe lo que sucede usando un método que coacciona los me gusta de la matriz en matrices como el segmento.
Mostrar fragmento de código
Observe lo que sucede usando un método que no coacciona los me gusta de la matriz en matrices como concat.
Mostrar fragmento de código
fuente
Con JavaScript ES6, puede usar el operador ... como un operador de propagación que esencialmente convertirá la matriz en valores. Entonces, puedes hacer algo como esto:
Si bien la sintaxis es concisa, no sé cómo funciona internamente y cuáles son las implicaciones de rendimiento en grandes matrices.
fuente
Array.push.apply
técnica.Aquí está la forma ES6
fuente
Hay varias respuestas que hablan sobre Array.prototype.push.apply . Aquí hay un claro ejemplo:
Si tiene sintaxis ES6:
fuente
Si desea modificar la matriz original, puede extender y presionar:
Si desea asegurarse de que solo los elementos del mismo tipo entren en la
source
matriz (sin mezclar números y cadenas, por ejemplo), use TypeScript.fuente
Tenemos dos matrices a y b. el código que hizo aquí es un valor de matriz se inserta en la matriz b.
fuente
Prueba esto:
fuente
en lugar de la función push (), use la función concat para IE. ejemplo,
fuente
Este es un código de trabajo y funciona bien:
fuente