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]

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]))


616

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

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

console.log(a);


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


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);

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.


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.


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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.