Załóżmy, że mam ten kod:
var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;
Teraz, jeśli chcę usunąć „nazwisko”? .... czy istnieje jakiś odpowiednik
myArray["lastname"].remove()
?
(Potrzebuję elementu, który zniknął, ponieważ liczba elementów jest ważna i chcę zachować porządek.)
"Test" + {};
jest całkowicie poprawną instrukcją JS.Odpowiedzi:
Obiekty w JavaScript można traktować jako tablice asocjacyjne, odwzorowujące klucze (właściwości) na wartości.
Aby usunąć właściwość z obiektu w JavaScript, użyj
delete
operatora:Zauważ, że po
delete
zastosowaniu do właściwości indeksuArray
utworzysz rzadko zapełnianą tablicę (tj. Tablicę z brakującym indeksem).Podczas pracy z instancjami
Array
, jeśli nie chcesz tworzyć słabo zaludnionej tablicy - a zazwyczaj nie - powinieneś użyćArray#splice
lubArray#pop
.Pamiętaj, że
delete
operator w JavaScript nie zwalnia bezpośrednio pamięci. Jego celem jest usunięcie właściwości z obiektów. Oczywiście, jeśli usuwana właściwość zawiera jedyne zachowane odwołanie do obiektuo
, to następnieo
będzie usuwana śmieci w normalny sposób.Korzystanie z
delete
operatora może wpływać na zdolność silników JavaScript do optymalizacji kodu .źródło
delete myArray[0]
. Zobacz stackoverflow.com/a/9973592/426379 i Usuwanie elementów tablicylength
Właściwość obiektu Array pozostaje niezmieniona.myArray
naprawdę wykorzystywane jako tablica - ale to nie jest (myArray
jest niefortunna nazwa), to jest obiekt. Więc w tym przypadkudelete
jest OK. Zauważ, że nawet gdyby został on utworzonynew Array()
i użyty jako tablica asocjacyjna, nadal byłby OK. Twoje ostrzeżenie jest jednak nadal ważne, jeśli używasz prawdziwych tablic.Wszystkie obiekty w JavaScript są implementowane jako tablice mieszające / tablice asocjacyjne. Zatem następujące są równoważne:
I, jak już wspomniano, „usuwasz” właściwość z obiektu za pomocą
delete
słowa kluczowego, którego możesz użyć na dwa sposoby:Mam nadzieję, że dodatkowe informacje pomogą ...
źródło
myObj['some;property']
działa, alemyObj.some;property
nie (z oczywistych powodów). Również może nie być oczywiste, że można użyć zmiennej w notacji nawiasowej, tj.var x = 'SomeProperty'; alert(myObj[x])
Żadna z poprzednich odpowiedzi nie odnosi się do faktu, że JavaScript nie ma na początku tablic asocjacyjnych - nie ma takiego
array
typu, patrztypeof
.Javascript ma instancje obiektów o właściwościach dynamicznych. Gdy właściwości zostaną pomylone z elementami instancji obiektu Array, wówczas nastąpi sytuacja Bad Things ™:
Problem
Rozwiązanie
Aby mieć uniwersalną funkcję usuwania, która cię nie wysadzi, użyj:
źródło
Array
JS są obiektami, spróbujtypeof new Array();
lubtypeof []
zweryfikuj.Array
jest po prostu pewnym rodzajem przedmiotu, a wcale nie „inną bestią”. W JS obiekty wyróżniają się nazwą konstruktora i łańcuchem prototypów, patrz Programowanie oparte na prototypach .delete
operatora niedoborówArray
poprzez zapewnienie prostej funkcji polimorficznej.delete
nie ma niedoboru.delete
służy do usuwania właściwości. Otóż to. Zastosowanie operatora delete do indeksu tablicy usuwa ten indeks. Czego więcej potrzeba? Pozostaje ci rzadka tablica, która jest cechą języka. Jeśli nie chcesz rzadkiej tablicy, nie usuwaj indeksu: użyjsplice
lubpop
.To tylko usuwa usuwa obiekt, ale nadal utrzymuje tę samą długość tablicy.
Aby usunąć, musisz zrobić coś takiego:
źródło
Chociaż przyjęta odpowiedź jest poprawna, brakuje wyjaśnienia, dlaczego działa.
Po pierwsze, twój kod powinien odzwierciedlać fakt, że NIE jest to tablica:
Pamiętaj, że wszystkie obiekty (w tym
Array
s) mogą być używane w ten sposób. Nie należy jednak oczekiwać, że standardowe funkcje tablic JS (pop, push, ...) będą działać na obiektach!Jak powiedziano w zaakceptowanej odpowiedzi, możesz następnie użyć
delete
do usunięcia wpisów z obiektów:Powinieneś zdecydować, którą trasę wybrać - albo użyj obiektów (tablice asocjacyjne / słowniki), albo tablic (mapy). Nigdy nie mieszaj ich dwóch.
źródło
Użyj metody,
splice
aby całkowicie usunąć element z tablicy obiektów:źródło
Jak zauważyły inne odpowiedzi, nie używasz tablicy JavaScript, ale obiekt Javascript, który działa prawie jak tablica asocjacyjna w innych językach, z wyjątkiem tego, że wszystkie klucze są konwertowane na ciągi. Nowa mapa przechowuje klucze w oryginalnym typie.
Jeśli masz tablicę, a nie obiekt, możesz użyć funkcji .filter tablicy , aby zwrócić nową tablicę bez elementu, który chcesz usunąć:
Jeśli masz starszą przeglądarkę i jQuery, jQuery ma
$.grep
metodę, która działa podobnie:źródło
Jest to elegancki sposób w Przewodniku po stylu Airbnb (ES7):
Prawa autorskie: https://codeburst.io/use-es2015-object-rest-operator-to-omit-properties-38a3ecffe90
źródło
Używasz Object, na początku nie masz tablicy asocjacyjnej. W przypadku tablicy asocjacyjnej dodawanie i usuwanie elementów przebiega następująco:
źródło
Możesz usunąć wpis z mapy, przypisując go jawnie do „niezdefiniowanego”. Tak jak w twoim przypadku:
źródło
Jeśli z jakiegoś powodu klawisz usuwania nie działa (jakby dla mnie nie działał)
Możesz go podzielić, a następnie odfiltrować niezdefiniowane wartości
Nie próbuj ich łączyć w łańcuch, ponieważ połączenie zwraca usunięte elementy;
źródło
Możemy również użyć go jako funkcji. Angular generuje pewien błąd, jeśli jest używany jako prototyp. Dzięki @HarpyWar. Pomogło mi to rozwiązać problem.
źródło
To bardzo proste, jeśli masz w projekcie zależność od underscore.js -
źródło
Użycie
"delete"
słowa kluczowego spowoduje usunięcie elementu tablicy z tablicy w javascript.Na przykład,
Rozważ następujące stwierdzenia.
Ostatni wiersz kodu usunie element tablicy, którego kluczem jest „status” z tablicy.
źródło
Bez zapętlania / iteracji otrzymujemy ten sam wynik
źródło
W przypadku „tablic”:
Jeśli znasz indeks:
Jeśli znasz wartość:
Najbardziej pozytywna odpowiedź na pytanie
delete
działa dobrze w przypadku obiektów, ale nie w przypadku prawdziwych tablic. Jeślidelete
go użyję, usuwa elementy z pętli, ale utrzymuje element jako,empty
a długość tablicy nie zmieni się. Może to stanowić problem w niektórych scenariuszach.Na przykład, jeśli wykonam myArray.toString () na myArray po usunięciu za
delete
jego pośrednictwem , utworzy pusty wpis tj. ,,źródło
Jedyna dla mnie metoda działania:
stosowanie:
źródło