Co stanowi różnicę pomiędzy stosowaniem do delete
operatora na elemencie tablicy, w przeciwieństwie do używania w Array.splice
sposób ?
Na przykład:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Po co w ogóle stosować metodę łączenia, jeśli mogę usuwać elementy tablicy tak jak mogę z obiektami?
javascript
arrays
array-splice
delete-operator
LYriCAlsSH
źródło
źródło
.splice
pętli spójrz na to pytanie: Usuń z tablicy w javascript .delete
iArray.prototype.splice
.Odpowiedzi:
delete
usunie właściwość obiektu, ale nie zindeksuje tablicy ani nie zaktualizuje jej długości. To sprawia, że wygląda na niezdefiniowany:Zauważ, że w rzeczywistości nie jest ustawiony na wartość
undefined
, a raczej właściwość jest usuwana z tablicy, przez co wydaje się niezdefiniowana. Narzędzia deweloperskie Chrome wyjaśniają to rozróżnienie, drukującempty
podczas logowania tablicy.myArray.splice(start, deleteCount)
faktycznie usuwa element, ponownie indeksuje tablicę i zmienia jej długość.źródło
delete
nie usunięcia elementu, ale nie reindex tablicy lub zaktualizować swoją długość (która znajduje się już od dawna, ponieważ długość jest zawsze najwyższy wskaźnik + 1).delete myArray[0]
składni „mówiąc oczekiwać operator i zamiast piły«delete». ” Korzystaniesplice
zalecane.delete myArray[0]
imyArray[0] = undefined
. W pierwszym przypadku właściwość jest całkowicie usuwana z obiektu tablicy. W drugim przypadku właściwość pozostaje z wartościąundefined
.empty
zamiastundefined
poprawić rozróżnienie między faktycznie usuniętym (lub niezainicjowanym) elementem tablicy a elementem o rzeczywistej wartościundefined
. Zauważ, że jak to mówię, to znaczy, że wyświetla tylko jakoempty
i nie odnosi się do prawdziwej wartości o nazwieempty
(która nie istnieje).Metoda Array.remove ()
John Resig , twórca jQuery, stworzył bardzo przydatną
Array.remove
metodę, której zawsze używam w swoich projektach.a oto kilka przykładów tego, jak można go użyć:
Strona Johna
źródło
[1,2,3].slice('1'); // =[2,3]
), Więc bezpieczniej jest zmienić to navar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
, a następnie zwraca wartość, którą zwróciłafor(var i in array)
cyklem. Usunąłem go i zamiast tego użyłem splotu.Ponieważ delete usuwa tylko obiekt z elementu w tablicy, długość tablicy nie zmieni się. Splice usuwa obiekt i skraca tablicę.
Poniższy kod wyświetli „a”, „b”, „undefined”, „d”
Podczas gdy wyświetli się „a”, „b”, „d”
źródło
myArray.splice(2,1)
Natknąłem się na to pytanie, próbując zrozumieć, jak usunąć każde wystąpienie elementu z tablicy. Oto porównanie z
splice
idelete
do usuwania każdego'c'
zitems
tablicy.źródło
Z Core JavaScript 1.5 Odniesienie> Operatory> Operatory specjalne> usuń Operatora :
źródło
splice
będzie działać z indeksami numerycznymi.mając na uwadze, że
delete
można go stosować do innych wskaźnikówprzykład:
źródło
Warto też wspomnieć, że splice działa tylko na tablicach. (Nie można polegać na właściwościach obiektu w celu zachowania zgodnej kolejności).
Aby usunąć parę klucz-wartość z obiektu, usuń jest właściwie tym, czego chcesz:
źródło
usuń połączenie Vs
po usunięciu elementu z tablicy
kiedy się splatasz
w przypadku usuwania Element zostanie usunięty , ale indeks pozostaje pusty
natomiast w przypadku łączenia element jest usuwany, a indeks pozostałych elementów jest odpowiednio zmniejszany
źródło
Jak wspomniano wiele razy powyżej, używanie
splice()
wydaje się być idealnym dopasowaniem. Dokumentacja w Mozilli:źródło
delete działa jak sytuacja nierzeczywista, po prostu usuwa element, ale długość tablicy pozostaje taka sama:
przykład z terminala węzłowego:
Oto funkcja usuwania elementu tablicy według indeksu, używając slice () , bierze arr jako pierwszy argument, a indeks elementu, który chcesz usunąć, jako drugi argument. Jak widać, faktycznie usuwa on element tablicy i zmniejsza długość tablicy o 1
Powyższa funkcja polega na przejściu wszystkich elementów do indeksu i wszystkich elementów po indeksie, a następnie połączeniu ich razem i zwrócenia wyniku.
Oto przykład wykorzystania powyższej funkcji jako modułu węzła, przydanie się terminalowi będzie przydatne:
pamiętaj, że to nie zadziała w jednej tablicy z duplikatami, ponieważ indexOf („c”) dostanie tylko pierwsze wystąpienie, a jedynie podzieli i usunie pierwsze znalezione „c”.
źródło
Jeśli chcesz iterować dużą tablicę i selektywnie usuwać elementy, kosztowne byłoby wywoływanie funkcji splice () dla każdego usunięcia, ponieważ funkcja splice () musiałaby za każdym razem ponownie indeksować kolejne elementy. Ponieważ tablice są asocjatywne w Javascripcie, bardziej efektywne byłoby usunięcie poszczególnych elementów, a następnie ponowne zindeksowanie tablicy.
Możesz to zrobić, budując nową tablicę. na przykład
Ale nie sądzę, że możesz zmodyfikować kluczowe wartości w oryginalnej tablicy, co byłoby bardziej wydajne - wygląda na to, że będziesz musiał utworzyć nową tablicę.
Zauważ, że nie musisz sprawdzać „niezdefiniowanych” wpisów, ponieważ tak naprawdę nie istnieją, a pętla for ich nie zwraca. Jest to artefakt drukowania macierzy, który wyświetla je jako niezdefiniowane. Nie wydają się istnieć w pamięci.
Byłoby miło, gdybyś mógł użyć czegoś takiego jak slice (), co byłoby szybsze, ale nie indeksuje się ponownie. Czy ktoś zna lepszy sposób?
W rzeczywistości możesz to zrobić w następujący sposób, co jest prawdopodobnie bardziej wydajne i wydajne:
źródło
możesz użyć czegoś takiego
źródło
slice
przypadku tła funkcjonalnego (prawdopodobnie mniej wydajnego).Dlaczego nie po prostu filtrować? Myślę, że jest to najwyraźniejszy sposób rozważenia tablic w js.
źródło
delete
lubslice
.Różnicę można zobaczyć, rejestrując długość każdej tablicy po zastosowaniu
delete
operatora isplice()
metody. Na przykład:usuń operatora
delete
Operator usuwa element z tablicy, ale „Znacznik” elementu wciąż istnieje.oak
został usunięty, ale nadal zajmuje miejsce w tablicy. Z tego powodu długość tablicy wynosi 5.metoda splice ()
splice()
Sposób całkowicie eliminuje wartość docelową oraz w „zastępczy” oraz.oak
został usunięty, podobnie jak miejsce, które zajmowało w tablicy. Długość tablicy wynosi teraz 4.źródło
przykład:
banan jest usuwany, a długość tablicy = 2
źródło
Są to różne rzeczy, które mają różne cele.
splice
jest specyficzne dla tablicy i użyte do usunięcia usuwa wpisy z tablicy i przesuwa wszystkie poprzednie wpisy w górę, aby wypełnić lukę. (Można go również użyć do wstawienia wpisów lub obu jednocześnie.)splice
Zmienilength
tablicę (zakładając, że nie jest to wywołanie braku operacji:)theArray.splice(x, 0)
.delete
nie zależy od tablicy; jest przeznaczony do użycia na obiektach: usuwa właściwość (parę klucz / wartość) z obiektu, na którym go używasz. Ma to zastosowanie tylko do tablic, ponieważ standardowe (np. Nietypowe) tablice w JavaScript nie są tak naprawdę tablicami *, są to obiekty ze specjalną obsługą niektórych właściwości, takich jak te, których nazwy to „indeksy tablic” (które są zdefiniowane jako nazwy ciągów „... których wartość liczbowai
należy do zakresu+0 ≤ i < 2^32-1
”) ilength
. Kiedy używaszdelete
do usunięcia pozycji tablicy, wszystko, co robi, to usunięcie pozycji; nie przesuwa kolejnych wpisów, aby wypełnić lukę, więc tablica staje się „rzadka” (całkowicie brakuje niektórych wpisów). Nie ma wpływu nalength
.Kilka aktualnych odpowiedzi na to pytanie błędnie stwierdza, że użycie
delete
„ustawia wpis naundefined
”. To nie jest poprawne To usuwa wpis (właściwość) całkowicie, pozostawiając lukę.Użyjmy kodu, aby zilustrować różnice:
* (to post na moim anemicznym małym blogu)
źródło
Obecnie są na to dwa sposoby
using splice ()
arrayObject.splice(index, 1);
za pomocą delete
delete arrayObject[index];
Zawsze jednak sugeruję używanie splajnu dla obiektów tablicowych i usuwania dla atrybutów obiektów, ponieważ delete nie aktualizuje długości tablicy.
źródło
OK, wyobraź sobie, że mamy tę tablicę poniżej:
Najpierw usuńmy:
i to jest wynik:
pusty! i zdobądźmy to:
Oznacza to, że tylko wartość została usunięta i jest teraz niezdefiniowana , więc długość jest taka sama, a także zwróci true ...
Zresetujmy naszą tablicę i zróbmy to tym razem:
i tym razem jest to wynik:
Jak widać długość tablicy zmieniła się i
arr[1]
wynosi teraz 3 ...Zwróci również usunięty element w tablicy, która
[3]
w tym przypadku ...źródło
Inni już poprawnie się
delete
z tym porównalisplice
.Innym interesującym porównanie jest
delete
kontraundefined
: usunięty element tablicy zużywa mniej pamięci niż jeden, który jest po prostu ustawionyundefined
;Na przykład ten kod nie zakończy się:
Powoduje ten błąd:
Jak widać,
undefined
faktycznie zajmuje pamięć sterty.Jednak jeśli również
delete
element arytowy (zamiast po prostu ustawiając go naundefined
), kod powoli się skończy:Są to skrajne przykłady, ale podkreślają,
delete
że nigdzie nie wspomniałem.źródło
Jeśli masz małą tablicę, możesz użyć
filter
:źródło
Najłatwiejszy sposób to prawdopodobnie
Mam nadzieję że to pomoże. Odniesienie: https://lodash.com/docs#compact
źródło
compact
... nie ma potrzeby lodash. SpróbujmyArray.filter(function(n){return n;})
Dla tych, którzy chcą korzystać z Lodash, można użyć:
myArray = _.without(myArray, itemToRemove)
Lub jak używam w Angular2
źródło
Usuń element z ostatniego
Usuń element od pierwszego
Usuń ze środka
Usuń jeden element z ostatniego
Usuń za pomocą numeru indeksu tablicy
źródło
Jeśli żądany element do usunięcia znajduje się w środku (powiedzmy, że chcemy usunąć „c”, którego indeks wynosi 1), możesz użyć:
źródło
IndexOf
akceptuje również typ referencyjny. Załóżmy następujący scenariusz:Różnie:
źródło
// wynik: myArray = ['b', 'c', 'd'];
źródło