Próbuję wypchnąć wiele elementów jako jedną tablicę, ale pojawia się błąd
> a = []
[]
> a.push.apply(null, [1,2])
TypeError: Array.prototype.push called on null or undefined
Próbuję robić podobne rzeczy, które zrobiłbym w rubinie, myślałem, że apply
to coś w stylu *
.
>> a = []
=> []
>> a.push(*[1,2])
=> [1, 2]
javascript
evfwcqcg
źródło
źródło
Teraz w ECMAScript2015 (alias ES6) możesz użyć operatora rozkładania, aby dodać wiele elementów jednocześnie:
Zobacz tabelę zgodności Kangax ES6, aby zobaczyć, które przeglądarki są kompatybilne
źródło
Możesz użyć
Array.concat
:źródło
Array.prototype.push.apply(arr1, arr2)
jest to poprawna odpowiedź, ponieważ używającarr1.concat(arr2)
ciebie tworzysz nową tablicę.arr1 = arr1.concat(arr2)
nie jest wielkim problemem i wygląda na znacznie czystszego. Pchanie do starej tablicy lub wymiana starej tablicy na nową zależy od potrzeb. Jeśli masz do czynienia z elementami powyżej 10 m, wypychanie do starej tablicy będzie działało szybciej, jeśli zarządzasz małymi fragmentami, prawie nie znajdziesz żadnej różnicy prędkości. Obie opcje są całkowicie uzasadnione.prototype.push.apply
dzwoni tylkopush
raz. Powyższe rozróżnienie nie jest konieczne w przypadku szybkości, ale operacja na miejscu vs tworzenie nowej tablicy. Co jeśli miałbym metodę, która wzięła tablicę i miała ją zmodyfikować w miejscu?concat
Metoda nie może działać, nawet z kodem VisionN jako że nie będzie modyfikować zmienną do wywołującego funkcję.a = a.concat(b)
jest wciąż krótszą składnią niżArray.prototype.push.apply(arr1, arr2)
Jeśli chcesz alternatywę dla
Array.concat
ECMAScript 2015 (alias ES6, ES2015), która podobnie jak ona nie modyfikuje tablicy, ale zwraca nową tablicę, możesz użyć operatora rozkładania w następujący sposób:Zauważ, że różni się to od
push
metody, ponieważpush
metoda mutuje / modyfikuje tablicę.Jeśli chcesz sprawdzić, czy niektóre funkcje ES2015 działają w przeglądarce, sprawdź tabelę zgodności Kangax .
Możesz także użyć Babel lub podobnego transpilatora, jeśli nie chcesz czekać na obsługę przeglądarki i chcesz używać ES2015 w produkcji.
źródło
Istnieje wiele odpowiedzi zalecamy stosowania:
Array.prototype.push(a, b)
. To dobry sposób, ALE jeśli będziesz mieć naprawdę duże b, będziesz miał błąd przepełnienia stosu (z powodu zbyt wielu argumentów). Uważaj tutaj.Zobacz Jaki jest najskuteczniejszy sposób konkatenacji tablic N? po więcej szczegółów.
źródło
źródło