Mam potrzebę dodania lub dodania elementów na początku tablicy.
Na przykład, jeśli moja tablica wygląda jak poniżej:
[23, 45, 12, 67]
Odpowiedź z mojego wywołania AJAX brzmi 34
: chcę, aby zaktualizowana tablica wyglądała następująco:
[34, 23, 45, 12, 67]
Obecnie planuję to zrobić w następujący sposób:
var newArray = [];
newArray.push(response);
for (var i = 0; i < theArray.length; i++) {
newArray.push(theArray[i]);
}
theArray = newArray;
delete newArray;
Czy jest na to lepszy sposób? Czy Javascript ma jakieś wbudowane funkcje, które to robią?
Złożoność mojej metody jest O(n)
i byłoby naprawdę interesujące zobaczyć lepsze implementacje.
javascript
arrays
Księżyc
źródło
źródło
push
instrukcji, po których następuje wywołaniereverse
, zamiast wywoływania przezunshift
cały czas.Odpowiedzi:
Zastosowanie
unshift
. To jest takpush
, że dodaje elementy na początku tablicy zamiast na końcu.unshift
/push
- dodaj element na początku / końcu tablicyshift
/pop
- usuń i zwróć pierwszy / ostatni element tablicyProsty schemat ...
i wykres:
Sprawdź dokumentację macierzy MDN . Praktycznie każdy język, który ma możliwość wypychania / wyskakiwania elementów z tablicy, będzie miał również możliwość cofania / zmiany (czasem nazywanych
push_front
/pop_front
) elementów, nigdy nie powinieneś ich implementować.Jak wskazano w komentarzach, jeśli chcesz uniknąć mutowania oryginalnej tablicy, możesz użyć
concat
, która łączy dwie lub więcej tablic razem. Możesz użyć tego, aby funkcjonalnie popchnąć pojedynczy element na przód lub tył istniejącej tablicy; aby to zrobić, musisz przekształcić nowy element w tablicę z jednym elementem:concat
może również dodawać elementy. Argumentyconcat
mogą być dowolnego typu; są domyślnie opakowane w tablicę jednoelementową, jeśli nie są już tablicą:źródło
concat
Korzystne może być użycie, ponieważ zwraca nową tablicę. Bardzo przydatny do tworzenia łańcuchów.[thingToInsertToFront].concat(originalArray).reduce(fn).reverse().map(fn)
itp ... Jeśli użyjeszunshift
, nie możesz wykonać tego łańcucha, ponieważ wszystko, co otrzymasz, to długość.źródło
W przypadku ES6 użyj operatora rozkładania
...
:PRÓBNY
źródło
concat
zamiast tego.Kolejny sposób to zrobić
concat
Różnica między
concat
iunshift
polega na tym, żeconcat
zwraca nową tablicę. Występ między nimi można znaleźć tutaj .Oto wynik testu
źródło
unshift
: 25 2510 ± 3,18% 99% wolniejconcat
: 2436894 ± 3,39% najszybciejSzybki ściąg:
Terminy shift / unshift i push / pop mogą być nieco mylące, przynajmniej dla osób, które mogą nie znać programowania w C.
Jeśli nie znasz języka lingo, oto szybkie tłumaczenie alternatywnych terminów, które mogą być łatwiejsze do zapamiętania:
źródło
masz tablicę:
var arr = [23, 45, 12, 67];
Aby dodać element na początku, chcesz użyć
splice
:źródło
unshift
50% szybszy (ale w większości bardziej czytelny)Bez mutacji
Właściwie wszystko
unshift
/push
ishift
/pop
mutują tablicę początkową.unshift
/push
Dodać element do istniejącej tablicy od rozpoczęcia / zakończenia ishift
/pop
usunąć element z początku / końca tablicy.Ale istnieje kilka sposobów dodawania elementów do tablicy bez mutacji. wynikiem jest nowa tablica, aby dodać na końcu tablicy użyj poniższego kodu:
Aby dodać na początek oryginalnej tablicy, użyj poniższego kodu:
W powyższy sposób dodajesz na początku / na końcu tablicy bez mutacji.
źródło
slice
funkcję na końcu,originArray
aby zapobiec jej zmienności.Korzystanie z destrukcji ES6: (unikanie mutacji oryginalnej tablicy)
const newArr = [item, ...oldArr]
źródło
źródło
Jeśli musisz ciągle wstawiać element na początku tablicy, szybciej jest używać
push
instrukcji, a następnie wywoływaćreverse
, zamiast wywoływaćunshift
cały czas.Test porównawczy: http://jsben.ch/kLIYf
źródło
Za pomocą
splice
wstawiamy element do tablicy na początku:źródło