Jaki jest najskuteczniejszy sposób łączenia N tablic obiektów w JavaScript?
Tablice są zmienne, a wynik można zapisać w jednej z tablic wejściowych.
javascript
arrays
Leonid
źródło
źródło
Odpowiedzi:
Jeśli łączysz więcej niż dwie tablice,
concat()
jest to droga do wygody i prawdopodobnej wydajności.W celu połączenia tylko dwóch tablic
push
można użyć zamiast tego wielu argumentów składających się z elementów do dodania do tablicy, aby dodać elementy z jednej tablicy do końca drugiej bez tworzenia nowej tablicy. Dziękislice()
niemu można go również użyć zamiast,concat()
ale wydaje się, że nie ma żadnej przewagi wydajności .W ECMAScript 2015 i nowszych wersjach można to jeszcze bardziej zmniejszyć
Wydaje się jednak, że w przypadku dużych tablic (rzędu 100 000 lub więcej elementów) technika przekazywania tablicy elementów do
push
(przy użyciuapply()
lub operatora rozprzestrzeniania ECMAScript 2015) może się nie powieść. W przypadku takich tablic lepszym rozwiązaniem jest użycie pętli. Szczegółowe informacje można znaleźć na stronie https://stackoverflow.com/a/17368101/96100 .źródło
a.concat(b)
Wydaje mi się, że twój test może zawierać błąd: przypadek testowy wydaje się niepotrzebnie robić kopię tablicy,a
a następnie ją wyrzucać.concat()
ona ogólnie szybsza. W przypadku konkatenacji tablicy z istniejącą tablicą w miejscu,push()
jest droga. Zaktualizowałem swoją odpowiedź.edycja : dowód wydajności: http://jsperf.com/multi-array-concat/7
edit2 : Tim Supinie wspomina w komentarzach, że może to spowodować, że interpreter przekroczy rozmiar stosu wywołań. Być może zależy to od silnika js, ale dostałem również „Przekroczono maksymalny rozmiar stosu wywołań” przynajmniej w Chrome. Przypadek testowy:
[].concat.apply([], Array(300000).fill().map(_=>[1,2,3]))
. (Otrzymałem również ten sam błąd przy użyciu obecnie akceptowanej odpowiedzi, więc ktoś przewiduje takie przypadki użycia lub buduje bibliotekę dla innych, specjalne testy mogą być konieczne bez względu na wybrane rozwiązanie).źródło
Dla osób używających ES2015 (ES6)
Możesz teraz używać składni spreadu do łączenia tablic:
źródło
Ta
concat()
metoda służy do łączenia dwóch lub więcej tablic. Nie zmienia istniejących tablic, zwraca tylko kopię połączonych tablic.źródło
concat
jest specjalnie używany do tworzenia nowych tablic bez mutowania oryginalnej tablicy. Jeśli chcesz zaktualizowaćarray1
, musisz użyćarray1.push(...array2, ...array3, ...array4)
Użyj Array.prototype.concat.apply do obsługi konkatenacji wielu tablic:
Przykład:
źródło
Jeśli jesteś w trakcie przepuszczania wyniku przez mapę / filtr / sortowanie itp. I chcesz skonkatować tablicę tablic, możesz użyć
reduce
źródło
W przypadku tablicy wielu tablic i ES6 użyj
Na przykład:
źródło
newArr = Array.from(new Set(newArr));
.any[]
? Pisanie jest tam - dziwne.[].concat.apply([], ...arr)
działa znacznie lepiej na dużych woluminach.Teraz możemy łączyć wiele tablic za pomocą
ES6
Spread
. Zamiast używaćconcat()
do konkatenacji tablic, spróbuj użyć składni rozproszonej, aby połączyć wiele tablic w jedną spłaszczoną tablicę. na przykład:źródło
rozwiązane w ten sposób.
źródło
Możesz użyć strony jsperf.com do porównania wydajności. Oto link do konkat .
Dodano porównanie między:
i:
Drugi jest prawie 10 razy wolniejszy w chromie.
źródło
push.apply()
, co wydaje się być szybsze niżconcat()
we wszystkich przeglądarkach oprócz Chrome. Zobacz moją odpowiedź.Z łatwością dzięki funkcji concat:
źródło
Oto funkcja, dzięki której można połączyć wiele tablic
Przykład -
wyjdzie
źródło
Jeśli masz tablicę tablic i chcesz połączyć elementy w jedną tablicę, wypróbuj następujący kod (wymaga ES2015):
Lub jeśli lubisz programowanie funkcjonalne
Lub jeszcze lepiej ze składnią ES5, bez operatora spreadu
Ten sposób jest przydatny, jeśli nie znasz nie. tablic w czasie kodowania.
źródło
Skróć za pomocą ES6.
Powoduje to konkatację i unikalność wielu tablic;
Demo na codepen
źródło
new Set()
usuwa zduplikowane elementy. Po prostu to usuń.[].concat(...Array)
Scal tablicę za pomocą push:
Korzystanie z operatora Concat and Spread:
źródło
gdzie „n” to pewna liczba tablic, może tablica tablic. . .
var answer = _.reduce (n, funkcja (a, b) {return a.concat (b)})
źródło
Jeśli istnieją tylko dwie tablice do konkatacji, a tak naprawdę musisz dołączyć jedną z tablic, zamiast tworzyć nową, push lub loop.
Benchmark: https://jsperf.com/concat-small-arrays-vs-push-vs-loop/
źródło
Spróbuj tego:
źródło
jeśli tablice N są pobierane z bazy danych i nie są zakodowane na stałe, zrobię to w ten sposób za pomocą ES6
źródło