Znajdź index
element tablicy, którego chcesz usunąć indexOf
, a następnie usuń ten indeks za pomocą splice
.
Metoda splice () zmienia zawartość tablicy poprzez usunięcie istniejących elementów i / lub dodanie nowych elementów.
const array = [2, 5, 9];
console.log(array);
const index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
// array = [2, 9]
console.log(array);
Drugim parametrem splice
jest liczba elementów do usunięcia. Zauważ, że splice
modyfikuje tablicę na miejscu i zwraca nową tablicę zawierającą usunięte elementy.
Ze względu na kompletność, oto funkcje. Pierwsza funkcja usuwa tylko pojedyncze wystąpienie (tj. Usuwa pierwsze dopasowanie 5
z [2,5,9,1,5,8,5]
), natomiast druga funkcja usuwa wszystkie wystąpienia:
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if(arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}
array.indexOf(testValue)
na pustej tablicy będzie wynosić -1, a jeśli testujesz na to, to nie ma łączenia. Może od tego czasu odpowiedź się zmieniła.Nie wiem, jak
array.remove(int)
się zachowujesz. Są trzy możliwości, o których mogę pomyśleć.Aby usunąć element tablicy z indeksu
i
:Jeśli chcesz usunąć każdy element z wartością
number
z tablicy:Jeśli chcesz, aby element o indeksie
i
już nie istniał, ale nie chcesz, aby indeksy innych elementów się zmieniały:źródło
delete
nie jest poprawnym sposobem na usunięcie elementu z tablicy!array.hasOwnProperty(i)
zwracanyfalse
i miał element w tej pozycjiundefined
. Przyznaję jednak, że nie jest to zbyt powszechne.delete
nie zaktualizuje długości tablicy ani nie kasuje elementu, tylko zastępuje go specjalną wartościąundefined
.undefined
: usuwa zarówno indeks, jak i wartość z tablicy, tzn. Podelete array[0]
,"0" in array
zwróci false.delete
robi, aby zrozumieć, dlaczego nie działa zgodnie z oczekiwaniami.Zredagowano w październiku 2016 r
W tym przykładzie kodu używam funkcji „array.filter (...)”, aby usunąć niechciane elementy z tablicy. Ta funkcja nie zmienia oryginalnej tablicy i tworzy nową. Jeśli Twoja przeglądarka nie obsługuje tej funkcji (np. Internet Explorer przed wersją 9 lub Firefox przed wersją 1.5), rozważ użycie filtru wypełniającego z przeglądarki Mozilla .
Usuwanie elementu (kod ECMA-262 Edition 5, inaczej styl JavaScript w starym stylu)
Usuwanie elementu (kod ECMAScript 6)
WAŻNE Składnia funkcji strzałek ECMAScript 6 "() => {}" nie jest w ogóle obsługiwana w przeglądarce Internet Explorer, Chrome przed wersją 45, Firefox przed wersją 22 i Safari przed wersją 10. Aby użyć składni ECMAScript 6 w starych przeglądarkach, możesz użyć BabelJS .
Usuwanie wielu elementów (kod ECMAScript 7)
Dodatkową zaletą tej metody jest to, że możesz usunąć wiele elementów
WAŻNE Funkcja „array.includes (...)” nie jest w ogóle obsługiwana w przeglądarce Internet Explorer, Chrome przed wersją 47, Firefox przed wersją 43, Safari przed wersją 9 i Edge przed wersją 14, więc tutaj jest polifill z Mozilli .
Usuwanie wielu elementów (być może w przyszłości)
Jeśli propozycja „This-Binding Syntax” zostanie kiedykolwiek zaakceptowana, będziesz mógł to zrobić:
Wypróbuj sam w BabelJS :)
Odniesienie
źródło
filter
musi być jednak znacznie wolniejszy dla dużej tablicy?filter
może mieć mniejszą wydajność, ale jest to bezpieczniejszy i lepszy kod. Ponadto możesz filtrować według indeksu, podając drugi argument w lambda:arr.filter((x,i)=>i!==2)
To zależy od tego, czy chcesz zachować puste miejsce, czy nie.
Jeśli chcesz puste miejsce, usuwanie jest w porządku:
Jeśli nie, powinieneś użyć metody łączenia :
A jeśli potrzebujesz wartości tego elementu, możesz po prostu zapisać zwrócony element tablicy:
Jeśli chcesz to zrobić w określonej kolejności, możesz użyć
array.pop()
dla ostatniego lubarray.shift()
pierwszego (i oba zwracają wartość przedmiotu).A jeśli nie znasz indeksu przedmiotu, możesz go użyć
array.indexOf(item)
(wif()
celu uzyskania jednego przedmiotu lub wwhile()
celu uzyskania wszystkich).array.indexOf(item)
zwraca indeks lub -1, jeśli nie znaleziono.źródło
delete
nie jest poprawnym sposobem na usunięcie elementu z tablicy !!array[index] = undefined;
. Używaniedelete
zniszczy optymalizację.Znajomy miał problemy z programem Internet Explorer 8 i pokazał mi, co zrobił. Powiedziałem mu, że to źle, a on powiedział mi, że otrzymał odpowiedź tutaj. Bieżąca najwyższa odpowiedź nie będzie działać we wszystkich przeglądarkach (na przykład Internet Explorer 8) i usunie tylko pierwsze wystąpienie elementu.
Usuń WSZYSTKIE instancje z tablicy
Pętla przechodzi przez tablicę do tyłu (ponieważ indeksy i długość będą się zmieniać w miarę usuwania elementów) i usuwa element, jeśli zostanie znaleziony. Działa we wszystkich przeglądarkach.
źródło
i = arr.length -1
lubi--
sprawia, że jest taka sama jak indeks maksymalny.arr.length
jest tylko wartością początkową dlai
.i--
zawsze będzie zgodne z prawdą (i zmniejsza się o 1 przy każdej operacji pętli), dopóki nie0
wyrówna się (wartość falsy), a następnie pętla się zatrzyma.arr.filter(function (el) { return el !== item })
, unikając konieczności wielokrotnego mutowania tablicy. To zużywa nieco więcej pamięci, ale działa znacznie wydajniej, ponieważ wymaga mniej pracy.Istnieją dwa główne podejścia:
splice () :
anArray.splice(index, 1);
usuń :
delete anArray[index];
Zachowaj ostrożność, gdy używasz delete dla tablicy. Jest dobry do usuwania atrybutów obiektów, ale nie tak dobrze do tablic. Lepiej jest używać
splice
do tablic.Pamiętaj, że jeśli użyjesz
delete
tablicy, możesz uzyskać błędne wynikianArray.length
. Innymi słowy,delete
usunąłby element, ale nie zaktualizowałby wartości właściwości length.Możesz także spodziewać się, że po użyciu delete będą występować dziury w numerach indeksów, np. Możesz mieć indeksy 1, 3, 4, 8, 9 i 11 oraz długość taką, jaka była przed użyciem delete. W takim przypadku wszystkie indeksowane
for
pętle uległyby awarii, ponieważ indeksy nie są już sekwencyjne.Jeśli
delete
z jakiegoś powodu jesteś zmuszony do używania , powinieneś używaćfor each
pętli, gdy potrzebujesz zapętlić tablice. W rzeczywistościfor
, jeśli to możliwe , zawsze unikaj używania indeksowanych pętli. W ten sposób kod byłby bardziej niezawodny i mniej podatny na problemy z indeksami.źródło
źródło
for in
tablicę, masz już problem.for in
tablice, masz już większe problemy.Nie ma potrzeby używania
indexOf
lubsplice
. Jednak działa lepiej, jeśli chcesz usunąć tylko jedno wystąpienie elementu.Znajdź i przenieś (przenieś):
Użyj
indexOf
isplice
(indexof):Używaj tylko
splice
(łączenie):Czasy działania nodejs dla tablicy z 1000 elementów (średnio ponad 10000 przebiegów):
indexof jest około 10 razy wolniejszy niż ruch . Nawet jeżeli poprawione przez usunięcie wywołanie
indexOf
w splice wykonuje znacznie gorsze niż ruch .źródło
To daje predykat zamiast wartości.
UWAGA: zaktualizuje podaną tablicę i zwróci zmienione wiersze.
Stosowanie
Definicja
źródło
Możesz to łatwo zrobić za pomocą metody filtrowania :
To usuwa wszystkie elementy z tablicy, a także działa szybciej niż kombinacja
slice
iindexOf
.źródło
John Resig opublikował dobre wdrożenie :
Jeśli nie chcesz rozszerzać obiektu globalnego, możesz zamiast tego zrobić coś takiego:
Ale głównym powodem, dla którego to publikuję, jest ostrzeżenie użytkowników przed alternatywną implementacją sugerowaną w komentarzach na tej stronie (14 grudnia 2007):
Z początku wydaje się, że działa dobrze, ale podczas bolesnego procesu odkryłem, że zawodzi przy próbie usunięcia drugiego do ostatniego elementu w tablicy. Na przykład, jeśli masz tablicę 10-elementową i próbujesz usunąć 9 element za pomocą:
Otrzymujesz 8-elementową tablicę. Nie wiem dlaczego, ale potwierdziłem, że oryginalna implementacja Johna nie ma tego problemu.
źródło
Object.prototype.hasOwnProperty
własnej skórze, dlaczego warto używać zawsze ¬¬Underscore.js może być wykorzystywany do rozwiązywania problemów z wieloma przeglądarkami. Używa wbudowanych metod przeglądarki, jeśli są obecne. Jeśli są nieobecne, jak w przypadku starszych wersji Internet Explorera, używa własnych metod niestandardowych.
Prosty przykład usuwania elementów z tablicy (ze strony internetowej):
źródło
Możesz użyć ES6. Na przykład, aby w tym przypadku usunąć wartość „3”:
Wynik :
źródło
Jeśli chcesz usunąć nową tablicę z usuniętymi pozycjami, zawsze możesz usunąć określony element i odfiltrować tablicę. Może potrzebować rozszerzenia obiektu tablicy dla przeglądarek, które nie implementują metody filtrowania, ale w dłuższej perspektywie jest to łatwiejsze, ponieważ wszystko, co robisz, to:
Powinien zostać wyświetlony
[1, 2, 3, 4, 6]
.źródło
Sprawdź ten kod. Działa w każdej większej przeglądarce .
Wywołaj tę funkcję
źródło
for in
i faktu, że skrypt można zatrzymać wcześniej, zwracając bezpośrednio wynik z pętli. Pozytywne opinie są uzasadnione;)for( i = 0; i < arr.length; i++ )
byłby lepszym podejściem, ponieważ zachowuje dokładne wskaźniki w stosunku do dowolnej kolejności, w której przeglądarka zdecyduje się przechowywać elementy (zfor in
). Takie postępowanie pozwala również uzyskać indeks tablicy wartości, jeśli jest potrzebny.Możesz użyć lodash _.pull ( mutate array), _.pullAt ( mutate array) lub _. bez ( mutate array),
źródło
ES6 i bez mutacji: (październik 2016 r.)
źródło
filter
?array.filter((_, index) => index !== removedIndex);
.Usunięcie określonego elementu / łańcucha z tablicy można wykonać w jednej linijce:
gdzie:
theArray : tablica, z której chcesz usunąć coś konkretnego
stringToRemoveFromArray : ciąg, który chcesz usunąć, a 1 to liczba elementów, które chcesz usunąć.
UWAGA : Jeśli „stringToRemoveFromArray” nie znajduje się w tablicy, spowoduje to usunięcie ostatniego elementu tablicy.
Zawsze dobrą praktyką jest sprawdzenie, czy element istnieje w tablicy przed jego usunięciem.
Jeśli masz dostęp do nowszych wersji Ecmascript na komputerach swojego klienta (OSTRZEŻENIE, może nie działać na starszych stacjach):
Gdzie „3” to wartość, którą chcesz usunąć z tablicy. Tablica stałaby się wtedy:
['1','2','4','5','6']
źródło
"stringToRemoveFromArray"
nie znajduje się w tablicy, spowoduje to usunięcie ostatniego elementu tablicy.Oto kilka sposobów na usunięcie elementu z tablicy za pomocą JavaScript .
Wszystkie opisane metody nie mutują oryginalnej tablicy , a zamiast tego tworzą nową.
Jeśli znasz indeks przedmiotu
Załóżmy, że masz tablicę i chcesz usunąć element na miejscu
i
.Jedną z metod jest użycie
slice()
:slice()
tworzy nową tablicę z otrzymanymi indeksami. Po prostu tworzymy nową tablicę, od początku do indeksu, który chcemy usunąć, i konkatenujemy kolejną tablicę od pierwszej pozycji po tej, którą usunęliśmy do końca tablicy.Jeśli znasz wartość
W tym przypadku jedną z dobrych opcji jest użycie
filter()
, które oferuje bardziej deklaratywne podejście:Wykorzystuje to funkcje strzałek ES6. Możesz użyć tradycyjnych funkcji do obsługi starszych przeglądarek:
lub możesz użyć Babel i przetransportować kod ES6 z powrotem do ES5, aby uczynić go bardziej zrozumiałym dla starych przeglądarek, a jednocześnie napisać nowoczesny kod JavaScript w swoim kodzie.
Usuwanie wielu elementów
Co jeśli zamiast jednego elementu chcesz usunąć wiele elementów?
Znajdźmy najprostsze rozwiązanie.
Według indeksu
Możesz po prostu utworzyć funkcję i usuwać elementy szeregowo:
Według wartości
Możesz wyszukać włączenie w ramach funkcji oddzwaniania:
Unikaj mutowania oryginalnej tablicy
splice()
(nie mylić zslice()
) mutuje oryginalną tablicę i należy tego unikać.(pierwotnie opublikowane na https://flaviocopes.com/how-to-remove-item-from-array/ )
źródło
OK, na przykład masz tablicę poniżej:
I chcemy usunąć numer 4. Możesz po prostu użyć poniższego kodu:
Jeśli ponownie używasz tej funkcji, piszesz funkcję wielokrotnego użytku, która zostanie dołączona do natywnej funkcji tablicy, jak poniżej:
Ale co powiesz na to, że zamiast tego masz poniżej tablicę z kilkoma [5] sami w tablicy?
Potrzebujemy pętli, aby je wszystkie sprawdzić, ale łatwiejszym i bardziej wydajnym sposobem jest użycie wbudowanych funkcji JavaScript, więc zamiast tego piszemy funkcję, która używa filtra takiego jak poniżej:
Istnieją również biblioteki stron trzecich, które pomagają ci to zrobić, takie jak Lodash lub Underscore. Aby uzyskać więcej informacji, spójrz na lodash _.pull, _.pullAt lub _. bez.
źródło
this.splice(num.indexOf(x), 1);
=>this.splice(this.indexOf(x), 1);
Jestem całkiem nowy w JavaScript i potrzebowałem tej funkcjonalności. Po prostu napisałem to:
Kiedy chcę go użyć:
Wyjście - zgodnie z oczekiwaniami. [„item1”, „item1”]
Możesz mieć inne potrzeby niż ja, więc możesz łatwo modyfikować je, aby je dopasować. Mam nadzieję, że to komuś pomoże.
źródło
Jeśli masz w tablicy złożone obiekty, możesz użyć filtrów? W sytuacjach, gdy $ .inArray lub array.splice nie jest tak łatwy w użyciu. Zwłaszcza jeśli obiekty są być może płytkie w tablicy.
Np. Jeśli masz obiekt z polem Id i chcesz go usunąć z tablicy:
źródło
Chcę odpowiedzieć na podstawie ECMAScript 6 . Załóżmy, że masz tablicę jak poniżej:
Jeśli chcesz usunąć ze specjalnego indeksu, takiego jak
2
, napisz poniższy kod:Ale jeśli chcesz usunąć specjalny element, taki jak
3
i nie znasz jego indeksu, wykonaj poniższe czynności:Wskazówka : użyj funkcji strzałki do wywołania zwrotnego filtra, chyba że otrzymasz pustą tablicę.
źródło
Aktualizacja: Ta metoda jest zalecana tylko wtedy, gdy nie można używać ECMAScript 2015 (wcześniej znanej jako ES6). Jeśli możesz z niego skorzystać, inne odpowiedzi tutaj zapewniają znacznie bardziej odpowiednie implementacje.
Ta lista rozwiąże Twój problem, a także usunie wszystkie wystąpienia argumentu zamiast tylko 1 (lub określonej wartości).
Stosowanie:
źródło
Wydajność
Dzisiaj (2019-12-09) Przeprowadzam testy wydajnościowe systemu macOS 10.13.6 (High Sierra) dla wybranych rozwiązań. Wyświetlam
delete
(A), ale nie używam go w porównaniu z innymi metodami, ponieważ pozostawił puste miejsce w tablicy.Wnioski
array.splice
(C) (z wyjątkiem Safari dla małych tablic, w których jest drugi raz)array.slice+splice
(H) jest najszybszym niezmiennym rozwiązaniem dla przeglądarek Firefox i Safari;Array.from
(B) jest najszybszy w ChromeDetale
W testach usuwam środkowy element z tablicy na różne sposoby. Rozwiązania A, C są na miejscu. Rozwiązania B, D, E, F, G, H są niezmienne.
Wyniki dla tablicy z 10 elementami
W Chrome
array.splice
(C) jest najszybszym rozwiązaniem na miejscu.array.filter
(D) jest najszybszym stały roztwór. Najwolniejszy toarray.slice
(F). Możesz wykonać test na swoim komputerze tutaj .Wyniki dla tablicy z 1.000.000 elementów
W Chrome
array.splice
(C) jest najszybszym rozwiązaniem na miejscu (delete
(C) jest podobne szybko - ale pozostawił puste miejsce w tablicy (więc nie wykonuje „pełnego usunięcia”)).array.slice-splice
(H) jest najszybszym stały roztwór. Najwolniejszy toarray.filter
(D i E). Możesz wykonać test na swoim komputerze tutaj .Pokaż fragment kodu
Porównanie przeglądarek: Chrome v78.0.0, Safari v13.0.4 i Firefox v71.0.0
źródło
Nigdy nie powinieneś mutować swojej tablicy. Jest to sprzeczne z funkcjonalnym wzorcem programowania. Możesz utworzyć nową tablicę bez odwoływania się do tablicy, którą chcesz zmienić przy użyciu metody ECMAScript 6
filter
;Załóżmy, że chcesz usunąć
5
z tablicy, możesz po prostu zrobić to w następujący sposób:To da ci nową tablicę bez wartości, którą chciałbyś usunąć. Rezultatem będzie:
Dla lepszego zrozumienia możesz przeczytać dokumentację MDN na Array.filter .
źródło
Bardziej nowoczesne podejście ECMAScript 2015 (wcześniej znane jako Harmony lub ES 6). Dany:
Następnie:
Wydajność:
Możesz użyć Babel i usługi wypełniania, aby upewnić się, że jest dobrze obsługiwana w różnych przeglądarkach.
źródło
.filter
zwraca nową tablicę, która nie jest dokładnie taka sama jak usunięcie elementu z tej samej tablicy. Zaletą tego podejścia jest to, że można łączyć ze sobą metody tablic. np .:[1,2,3].filter(n => n%2).map(n => n*n) === [ 1, 9 ]
splice
lubslice
.items= items.filter(x=>x!=3)
. Poza tym PO nie stwierdził żadnego wymogu dla dużego zestawu danych.Masz od 1 do 9 w tablicy i chcesz usunąć 5. Użyj poniższego kodu:
Jeśli chcesz wiele wartości. Przykład: - 1,7,8
Jeśli chcesz usunąć wartość tablicy z tablicy. Przykład: [3,4,5]
Zawiera obsługiwaną przeglądarkę to link .
źródło
Wiem, że jest już wiele odpowiedzi, ale wiele z nich wydaje się nadmiernie komplikować problem. Oto prosty, rekurencyjny sposób usuwania wszystkich instancji klucza - wywołuje siebie, dopóki indeks nie zostanie znaleziony. Tak, działa tylko w przeglądarkach
indexOf
, ale jest prosty i można go łatwo wypełnić.Funkcja samodzielna
Metoda prototypowa
źródło
Możesz wykonać pętlę wsteczną, aby upewnić się, że indeksy nie zostaną zepsute, jeśli istnieje wiele wystąpień elementu.
Demo na żywo
źródło