spingere più elementi nell'array


286

Sto cercando di inviare più elementi come un array, ma ricevo un errore

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

Sto cercando di fare cose simili a quelle che farei in ruby, pensavo che applyfosse qualcosa del genere *.

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

Risposte:


241

Quando si utilizzano la maggior parte delle funzioni di oggetti con applyo call, il contextparametro DEVE essere l'oggetto su cui si sta lavorando.

In questo caso, è necessario a.push.apply(a, [1,2])(o più correttamente Array.prototype.push.apply(a, [1,2]))


620

È possibile inserire più elementi in un array nel modo seguente

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

console.log(a);


1
Questa risposta e la risposta selezionata producono risultati diversi e forse inaspettati. a.push (1) vs. a.push ([1])
oevna il

1
Qualcuno può spiegare, perché questo ha tanti più voti rispetto alla risposta accettata? Potrebbe essere più facile, ma è meno flessibile. Se vuoi unire 2 array, questo non funzionerà.
BluE,

@BluE se vuoi unire due array, usa array.concat ()
Florent Arlandis il

@FlorentArlandis array.concat non funziona per aggiungere il secondo array al primo. Ne creerà uno nuovo. So che è simile. L'operatore di diffusione è quello che stavo cercando. Basta guardare le altre risposte e commenti lì per i dettagli.
BluE,

435

Ora in ECMAScript2015 (aka ES6), è possibile utilizzare l' operatore di diffusione per aggiungere più elementi contemporaneamente:

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

Vedi la tabella di compatibilità ES6 di Kangax per vedere quali browser sono compatibili


41
whaaaaaaat è fantastico, inoltre, se lo fai in dattiloscritto si compila in push.apply in modo da avere retrocompatibilità
Chris

72

Puoi usare Array.concat:

var result = a.concat(b);

16
Array.prototype.concat restituisce un nuovo array.
suricactus,

12
Vuole spingere verso l'array esistente, quindi Array.prototype.push.apply(arr1, arr2)è la risposta corretta, perché usando arr1.concat(arr2)te stai creando un nuovo array.
suricactus,

3
@suricactus arr1 = arr1.concat(arr2)non è un grosso problema e sembra molto più pulito. Il passaggio al vecchio array o la sostituzione del vecchio array con quello nuovo dipende dalle proprie esigenze. Se hai a che fare con più di 10m di elementi che spingono sul vecchio array funzioneranno più velocemente, se gestisci piccoli blocchi difficilmente troverai alcuna differenza di velocità. Entrambe le opzioni sono del tutto legittime.
VisioN,

5
@YuvalA. prototype.push.applychiama solo pushuna volta. E la distinzione sopra non è necessaria per quanto riguarda la velocità ma un'operazione sul posto rispetto alla creazione di un nuovo array. E se avessi un metodo che ha preso un array e che avrei dovuto modificarlo sul posto? Il concatmetodo non può funzionare, anche con il codice VisionN in quanto non modificherà la variabile per il chiamante della funzione.
coderforlife

1
a = a.concat(b)è ancora una sintassi più breve diArray.prototype.push.apply(arr1, arr2)
Aizzat Suhardi

22

Se si desidera un'alternativa a Array.concatECMAScript 2015 (aka ES6, ES2015) che, allo stesso modo, non modifica l'array ma restituisce un nuovo array, è possibile utilizzare l' operatore spread in questo modo:

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

Nota che questo è diverso dal pushmetodo poiché il pushmetodo muta / modifica l'array.

Se vuoi vedere se alcune funzionalità ES2015 funzionano nel tuo browser, controlla la tabella di compatibilità di Kangax .

Puoi anche usare Babel o un transpiler simile se non vuoi aspettare il supporto del browser e vuoi usare ES2015 in produzione.


4

Ci sono molte risposte a raccomandare l'uso: Array.prototype.push(a, b). È un bel modo, MA se avrai una b davvero grande, avrai un errore di overflow dello stack (a causa di troppi argomenti). Stai attento qui.

Vedi Qual è il modo più efficiente per concatenare le matrici N? per ulteriori dettagli.


3
Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti a un autore, lascia un commento sotto il suo post. [Come scrivo una buona risposta? ] ( Stackoverflow.com/help/how-to-answer )
mrun

1
Spiacente, non posso lasciare commenti sotto le risposte (tranne il mio) a causa della reputazione insufficiente :). Ma sembra che questo dovrebbe essere menzionato qui per avere una panoramica completa. Potresti per favore farlo per me? Quindi rimuoverò la mia risposta.
12kb

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.