Jak usunąć element w tablicy w javascript?

138

Jak usunąć klawisz „bar” z tablicy foo, aby „bar” nie pojawiał się w

for(key in foo){alert(key);}
Steven Noble
źródło

Odpowiedzi:

243

Nie używaj funkcji delete, ponieważ nie usunie to elementu z tablicy, ustawi go tylko jako niezdefiniowany, co nie zostanie wtedy poprawnie odzwierciedlone w długości tablicy.

Jeśli znasz klucz, powinieneś użyć splotu tj

myArray.splice(key, 1);

Dla kogoś na pozycji Stevena możesz spróbować czegoś takiego:

for (var key in myArray) {
    if (key == 'bar') {
        myArray.splice(key, 1);
    }
}

lub

for (var key in myArray) {
    if (myArray[key] == 'bar') {
        myArray.splice(key, 1);
    }
}
chodzenie
źródło
3
+1 Słuszna
CMS
3
@ThiefMaster - Chcesz wyjaśnić? Nie wiem, co to znaczy i chętnie się tego uczę. Jak zawsze, zmiana jest 1 000 000 razy lepsza niż komentarz z własnej ręki; powinieneś to wiedzieć przy ilości powtórzeń, które masz.
będzie
21
Użyj for (var key in myArray)zamiast for (key in myArray)- w przeciwnym razie keyjest zmienną globalną i jeśli wywołasz funkcję wewnątrz tej pętli, która ma ten sam problem, otrzymasz nieoczekiwane wyniki.
ThiefMaster
2
Uwaga, drugi przykład nie działa, jeśli tablica zawiera wiele elementów w wierszu, które pasują do słowa „bar”. Indeks tablicy się przesunie, a połowę elementów zostanie pominiętych. Zamiast tego użyj pętli for, która zmniejsza indeks po znalezieniu dopasowania.
Dave Lancea
Tablica obiektów: stackoverflow.com/questions/15287865/ ...
Fedir RYKHTIK
52
delete foo[key];

:RE


źródło
4
technicznie to nie odpowiada na pytanie. on chce usunąć klucz „bar”. a twoja kluczowa zmienna tego nie sugeruje. : P
Kon,
4
key = 'bar'; eval ("usuń foo." + klawisz); ukrywa ; D
olliej
3
Czy nie używać eval. Usunięcie klucza / indeksu obiektu / tablicy można osiągnąć znacznie prostszymi metodami, które nie są używane eval.
Dinei
4
Właściwie, jeśli usuniesz z tablicy indeksowanej przez delete foo [klucz], zapisze wartość w foo [klucz] = undefined, a foo.length pozostanie taka sama, co jest błędne. Więc zamiast tego użyj SPLICE
Павел Иванов
użyj delete foo [klawisz] to źle; należy użyć foo.splice (key, 1);
vnguyen
38

Ważna uwaga: tablice JavaScript nie są tablicami asocjacyjnymi, jak te, do których możesz być przyzwyczajony w PHP. Jeśli twój „klucz tablicy” jest łańcuchem, nie wykonujesz już operacji na zawartości tablicy. Twoja tablica jest obiektem i używasz notacji nawiasów, aby uzyskać dostęp do elementu członkowskiego o nazwie <nazwa klucza>. A zatem:

var myArray = [];
myArray ["bar"] = true;
myArray ["foo"] = true;
alert (myArray.length); // zwraca 0.

ponieważ nie dodałeś elementów do tablicy, zmodyfikowałeś tylko elementy bar i foo myArray.

John Factorial
źródło
37

Jeśli znasz nazwę klucza, zrób tak:

delete array['key_name']
user3177525
źródło
2
To nie jest tablica! To obiekt (tak, w JS nazywane są one tablicami asocjacyjnymi, ale nie, tak naprawdę nie są, a ta metoda jest szkodliwa, jeśli naprawdę pracujesz z tablicą JS).
licznik zimowy
3

Tak bym to zrobił

 myArray.splice( myArray.indexOf('bar') , 1) 
stackoverflows
źródło
1
Metoda Array.prototype.indexOf () szuka wartości w tablicy, a nie klucza. Więc to nie zadziała.
Nadav