empurrar vários elementos para a matriz

284

Estou tentando enviar vários elementos como uma matriz, mas obtendo erro

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

Eu estou tentando fazer coisas semelhantes às que eu faria em rubi, eu estava pensando que applyé algo assim *.

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

Respostas:

240

Ao usar a maioria das funções de objetos com applyou call, o contextparâmetro DEVE ser o objeto em que você está trabalhando.

Nesse caso, você precisa a.push.apply(a, [1,2])(ou mais corretamente Array.prototype.push.apply(a, [1,2]))

Niet, o Escuro Absol
fonte
616

Você pode inserir vários elementos em uma matriz da seguinte maneira

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

console.log(a);

amit1310
fonte
1
Esta resposta e a resposta selecionada produzem resultados diferentes, e talvez inesperados. a.push (1) vs. a.push ([1])
oevna
1
Alguém pode explicar por que isso tem muito mais votos do que a resposta aceita? Pode ser mais fácil, mas é menos flexível. Se você deseja mesclar duas matrizes, isso não funcionará.
BluE 17/09/19
@BluE se você quiser mesclar duas matrizes, basta usar array.concat ()
Florent Arlandis
@FlorentArlandis array.concat não funciona para adicionar o segundo array ao primeiro. Isso criará um novo. Eu sei que é semelhante. O operador de propagação é o que eu estava procurando. Basta olhar para as outras respostas e comentários para obter detalhes.
BluE 27/02
435

Agora no ECMAScript2015 (também conhecido como ES6), você pode usar o operador de spread para anexar vários itens de uma vez:

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

Consulte a tabela de compatibilidade ES6 da Kangax para ver quais navegadores são compatíveis

canac
fonte
41
whaaaaaaat isto é incrível, além disso, se você fizer isso à máquina que irá compilar para push.apply então você tem compatibilidade com versões anteriores
Chris
72

Você pode usar Array.concat:

var result = a.concat(b);
Visão
fonte
16
Array.prototype.concat retorna uma nova matriz.
suricactus
12
Ele quer passar para a matriz existente, assim Array.prototype.push.apply(arr1, arr2)é a resposta correta, porque usando arr1.concat(arr2)você está criando uma nova matriz.
suricactus
3
@suricactus arr1 = arr1.concat(arr2)não é grande coisa e parece muito mais limpo. Enviar para a matriz antiga ou substituir a matriz antiga pela nova depende das suas necessidades. Se você lida com mais de 10m de elementos pressionando a matriz antiga, funcionará mais rápido, se você gerenciar pequenos pedaços, dificilmente encontrará diferença na velocidade. Ambas as opções são completamente legítimas.
VisioN
5
@YuvalA. prototype.push.applysó liga pushuma vez. E a distinção acima não é necessária sobre velocidade, mas uma operação no local versus a criação de uma nova matriz. E se eu tivesse um método que pegou uma matriz e deveria modificá-la no local? O concatmétodo não pode funcionar, mesmo com o código do VisionN, pois ele não modifica a variável para o responsável pela chamada da função.
Coderforlife 2/09/16
1
a = a.concat(b)ainda é uma sintaxe mais curto do queArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi
22

Se você deseja uma alternativa Array.concatno ECMAScript 2015 (também conhecido como ES6, ES2015) que, como ele, não modifica a matriz, mas retorna uma nova matriz, pode usar o operador de propagação da seguinte forma:

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

Observe que isso é diferente do pushmétodo, pois o pushmétodo muda / modifica a matriz.

Se você quiser ver se certos recursos do ES2015 funcionam no seu navegador, verifique a tabela de compatibilidade do Kangax .

Você também pode usar Babel ou um transpilador semelhante se não desejar esperar pelo suporte do navegador e desejar usar o ES2015 na produção.

John
fonte
4

Há muitas respostas recomendar ao uso: Array.prototype.push(a, b). É uma maneira legal, mas se você tiver um b muito grande, terá um erro de estouro de pilha (por causa de muitos argumentos). Tenha cuidado aqui.

Consulte Qual é a maneira mais eficiente de concatenar N matrizes? para mais detalhes.

12kb
fonte
3
Isso não fornece uma resposta para a pergunta. Para criticar ou solicitar esclarecimentos a um autor, deixe um comentário abaixo da postagem. [Como escrevo uma boa resposta? ] ( stackoverflow.com/help/how-to-answer )
mrun 04/04
1
Desculpe, não posso deixar comentários com respostas (exceto as minhas) por causa da reputação insuficiente :). Mas parece que isso deve ser mencionado aqui para ter uma visão geral completa. Você poderia fazer isso por mim? Então eu removerei minha resposta.
12kb
0
var a=[];
a.push({
 name_a:"abc",
 b:[]
});

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