empujar múltiples elementos a la matriz

284

Estoy tratando de empujar múltiples elementos como una matriz, pero obtengo un error

> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined

Estoy tratando de hacer cosas similares a las que haría en ruby, estaba pensando que applyes algo así *.

>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
evfwcqcg
fuente

Respuestas:

240

Cuando se utilizan la mayoría de las funciones de objetos con applyo call, el contextparámetro DEBE ser el objeto en el que está trabajando.

En este caso, necesita a.push.apply(a, [1,2])(o más correctamente Array.prototype.push.apply(a, [1,2]))

Niet the Dark Absol
fuente
617

Puede insertar múltiples elementos en una matriz de la siguiente manera

var a = [];
    
a.push(1, 2, 3);

console.log(a);

amit1310
fuente
1
Esta respuesta y la respuesta seleccionada producen resultados diferentes, y quizás inesperados. a.push (1) vs. a.push ([1])
oevna
1
¿Alguien puede explicar por qué esto tiene tantos votos más que la respuesta aceptada? Puede ser más fácil, pero es menos flexible. Si desea fusionar 2 matrices, esto no funcionará.
BluE
@BluE si desea fusionar dos matrices, simplemente use array.concat ()
Florent Arlandis
@FlorentArlandis array.concat no funciona para agregar la segunda matriz a la primera. Creará uno nuevo. Sé que es similar El operador de propagación es lo que estaba buscando. Simplemente mire las otras respuestas y comentarios allí para más detalles.
BluE
435

Ahora en ECMAScript2015 (también conocido como ES6), puede usar el operador de propagación para agregar varios elementos a la vez:

var arr = [1];
var newItems = [2, 3];
arr.push(...newItems);
console.log(arr);

Consulte la tabla de compatibilidad ES6 de Kangax para ver qué navegadores son compatibles

canac
fuente
41
Whaaaaaaat, esto es increíble, además, si lo haces en mecanografiado se compilará para presionar. Aplicar para que tengas compatibilidad con versiones anteriores
Chris
72

Puedes usar Array.concat:

var result = a.concat(b);
Visión
fuente
16
Array.prototype.concat devuelve una nueva matriz.
suricactus
12
Él quiere avanzar a la matriz existente, por lo que Array.prototype.push.apply(arr1, arr2)es la respuesta correcta, porque al usarlo arr1.concat(arr2)se está creando una nueva matriz.
suricactus
3
@suricactus arr1 = arr1.concat(arr2)no es un gran problema y se ve mucho más limpio. Empujar a una matriz anterior o reemplazar una matriz antigua por una nueva depende de sus necesidades. Si maneja elementos de más de 10 millones, empujar a una matriz anterior funcionará más rápido, si maneja pequeños trozos, difícilmente encontrará diferencias en la velocidad. Ambas opciones son completamente legítimas.
VisioN
55
@YuvalA. prototype.push.applysolo llama pushuna vez. Y la distinción anterior no es necesaria sobre la velocidad, sino una operación in situ frente a la creación de una nueva matriz. ¿Qué pasaría si tuviera un método que tomara una matriz y supuestamente la modificara en el lugar? El concatmétodo no puede funcionar, incluso con el código de VisionN ya que no modificará la variable para el llamador de la función.
coderforlife
1
a = a.concat(b)sigue siendo una sintaxis más corta queArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi
22

Si desea una alternativa a Array.concatECMAScript 2015 (también conocido como ES6, ES2015) que, al igual que esta, no modifica la matriz pero devuelve una nueva matriz, puede usar el operador de propagación de la siguiente manera:

var arr = [1];
var newItems = [2, 3];
var newerItems = [4, 5];
var newArr = [...arr, ...newItems, ...newerItems];
console.log(newArr);

Tenga en cuenta que esto es diferente al pushmétodo ya que el pushmétodo muta / modifica la matriz.

Si desea ver si ciertas funciones de ES2015 funcionan en su navegador, consulte la tabla de compatibilidad de Kangax .

También puede usar Babel o un transpilador similar si no desea esperar el soporte del navegador y quiere usar ES2015 en producción.

Juan
fuente
4

Hay muchas respuestas a recomendar el uso: Array.prototype.push(a, b). Es una buena manera, PERO si tendrá una b realmente grande, tendrá un error de desbordamiento de pila (debido a demasiados argumentos). Ten cuidado aquí.

Consulte ¿Cuál es la forma más eficiente de concatenar matrices de N? para más detalles.

12kb
fuente
3
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación. [¿Cómo escribo una buena respuesta? ] ( stackoverflow.com/help/how-to-answer )
mrun
1
Lo siento, no puedo dejar comentarios debajo de las respuestas (excepto la mía) debido a la falta de reputación :). Pero parece que esto debería mencionarse aquí para tener una visión general completa. ¿Podrías hacerlo por mí? Entonces eliminaré mi respuesta.
12kb
0
var a=[];
a.push({
 name_a:"abc",
 b:[]
});

a.b.push({
  name_b:"xyz"
});
Alex Kumbhani
fuente