Tengo la necesidad de agregar o anteponer elementos al comienzo de una matriz.
Por ejemplo, si mi matriz se ve a continuación:
[23, 45, 12, 67]
Y la respuesta de mi llamada AJAX es 34
, quiero que la matriz actualizada sea como la siguiente:
[34, 23, 45, 12, 67]
Actualmente estoy planeando hacerlo así:
var newArray = [];
newArray.push(response);
for (var i = 0; i < theArray.length; i++) {
newArray.push(theArray[i]);
}
theArray = newArray;
delete newArray;
¿Hay alguna forma mejor de hacer esto? ¿Tiene Javascript alguna funcionalidad incorporada que haga esto?
La complejidad de mi método es O(n)
y sería realmente interesante ver mejores implementaciones.
javascript
arrays
Luna
fuente
fuente
push
declaraciones seguidas de una llamada areverse
, en lugar de llamarunshift
todo el tiempo.Respuestas:
Uso
unshift
. Es comopush
, excepto que agrega elementos al principio de la matriz en lugar del final.unshift
/push
- agrega un elemento al principio / final de una matrizshift
/pop
- eliminar y devolver el primer / último elemento de una matrizUn diagrama simple ...
y gráfico:
Consulte la documentación de la matriz MDN . Prácticamente todos los lenguajes que tienen la capacidad de insertar / extraer elementos de una matriz también tendrán la capacidad de quitar / cambiar elementos (a veces llamados
push_front
/pop_front
), nunca debería tener que implementarlos usted mismo.Como se señaló en los comentarios, si desea evitar la mutación de su matriz original, puede usar
concat
, que concatena dos o más matrices juntas. Puede usar esto para empujar funcionalmente un solo elemento en la parte frontal o posterior de una matriz existente; para hacerlo, debe convertir el nuevo elemento en una sola matriz de elementos:concat
También puede agregar elementos. Los argumentosconcat
pueden ser de cualquier tipo; están implícitamente envueltos en una matriz de un solo elemento, si aún no son una matriz:fuente
concat
puede ser preferible ya que devuelve la nueva matriz. Muy útil para encadenar.[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)
etc ... Si lo usasunshift
, no puedes encadenarlo porque todo lo que obtienes es la longitud.fuente
Con ES6, use el operador de propagación
...
:MANIFESTACIÓN
fuente
concat
en su lugar.Otra forma de hacerlo a través de
concat
La diferencia entre
concat
yunshift
es queconcat
devuelve una nueva matriz. El rendimiento entre ellos se puede encontrar aquí .Aquí está el resultado de la prueba.
fuente
unshift
± 3.18% 99% más lentoconcat
: 2,436,894 ± 3.39% más rápidoHoja de trucos rápida:
Los términos shift / unshift y push / pop pueden ser un poco confusos, al menos para las personas que pueden no estar familiarizadas con la programación en C.
Si no está familiarizado con la jerga, aquí hay una traducción rápida de términos alternativos, que puede ser más fácil de recordar:
fuente
tienes una matriz:
var arr = [23, 45, 12, 67];
Para agregar un elemento al principio, desea usar
splice
:fuente
unshift
50% más rápido (pero en su mayoría más legible)Sin mutar
En realidad, todos
unshift
/push
yshift
/pop
mutan la matriz de origen.El
unshift
/push
agregar un elemento a la matriz existente desde el inicio / final yshift
/pop
eliminar un elemento desde el principio / final de una matriz.Pero hay pocas formas de agregar elementos a una matriz sin una mutación. el resultado es una nueva matriz, para agregar al final de la matriz use el siguiente código:
Para agregar al comienzo de la matriz original, use el siguiente código:
Con la forma anterior, agrega al principio / final de una matriz sin una mutación.
fuente
slice
función al final deoriginArray
para evitar su mutabilidad.Uso de la desestructuración de ES6: (evitando la mutación de la matriz original)
const newArr = [item, ...oldArr]
fuente
Si necesita insertar continuamente un elemento al comienzo de una matriz, es más rápido usar
push
sentencias seguidas de una llamada areverse
, en lugar de llamar aunshift
todo el tiempo.Prueba de referencia: http://jsben.ch/kLIYf
fuente
Usando
splice
, insertamos un elemento en una matriz al comienzo:fuente