Powiedzmy, że tworzę obiekt w następujący sposób:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Jaki jest najlepszy sposób, aby usunąć właściwość, regex
aby uzyskać nowe myObject
w następujący sposób?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
johnstok
źródło
źródło
delete
byłaby to najwolniejsza opcja, ponieważ jest to rzeczywista operacja, a nie dwie pozostałe, które są zwykłymi zadaniami. Ale sedno sprawy polega na tym, że przypisanie właściwości do obiektunull
lubundefined
nie usunięcie go z obiektu, ale ustawienie tej właściwości na określoną określoną stałą wartość. (Poniższe odpowiedzi podają powody, dla których jest to znacząca różnica.)Odpowiedzi:
Lubię to:
Próbny
Dla każdego, kto chce przeczytać więcej na ten temat, użytkownik kangax Stack Overflow napisał niezwykle dokładny post na blogu o
delete
oświadczeniu na swoim blogu, Zrozumieć usunięcie . Jest wysoce zalecane.źródło
var x = {a : 'A', b : 'B'};
Porównaj:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
dox.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
Obiekty w JavaScript można traktować jak mapy między kluczami a wartościami.
delete
Operatora jest stosowane do usuwania tych klawiszy, powszechnie znane jako właściwości obiektu, po jednej na raz.delete
Operator nie bezpośrednio wolnej pamięci, a różni się od prostego przypisania wartości odnull
lubundefined
na obiekcie, że właściwość samo jest usuwany z przedmiotu. Zauważ, że jeśli wartością usuniętej właściwości był typ odwołania (obiekt), a inna część programu nadal zawiera odwołanie do tego obiektu, wówczas obiekt ten nie będzie oczywiście usuwany, dopóki wszystkie odwołania do niego nie będą mieć zniknął.delete
będzie działać tylko w przypadku właściwości, których deskryptor oznacza je jako konfigurowalne.źródło
Działa to w Firefox i Internet Explorer i myślę, że działa we wszystkich innych.
źródło
delete
Operatora jest stosowane do usuwania właściwości z obiektów.Pamiętaj, że w przypadku tablic nie jest to równoznaczne z usunięciem elementu . Aby usunąć element z tablicy, użyj
Array#splice
lubArray#pop
. Na przykład:Detale
delete
w JavaScript ma inną funkcję niż słowo kluczowe w C i C ++: nie zwalnia bezpośrednio pamięci. Zamiast tego jego jedynym celem jest usunięcie właściwości z obiektów.W przypadku tablic usunięcie właściwości odpowiadającej indeksowi tworzy tablicę rzadką (tj. Tablicę z „dziurą” w niej). Większość przeglądarek przedstawia te brakujące wskaźniki tablic jako „puste”.
Pamiętaj, że
delete
nie przenosi sięarray[3]
doarray[2]
.Różne funkcje wbudowane w JavaScript inaczej przetwarzają rzadkie tablice.
for...in
całkowicie pominie pusty indeks.Tradycyjna
for
pętla zwróciundefined
wartość dla indeksu.Każda zastosowana metoda
Symbol.iterator
zwróciundefined
wartość dla indeksu.forEach
,map
Ireduce
po prostu pominąć brakujące indeksu.Tak więc
delete
operator nie powinien być używany do typowego przypadku usuwania elementów z tablicy. Tablice mają dedykowane metody usuwania elementów i ponownego przydzielania pamięci:Array#splice()
iArray#pop
.Tablica # splice (start [, deleteCount [, item1 [, item2 [, ...]]]])
Array#splice
mutuje tablicę i zwraca wszelkie usunięte indeksy.deleteCount
elementy są usuwane z indeksustart
iitem1, item2... itemN
wstawiane do tablicy z indeksustart
. JeślideleteCount
zostanie pominięty, elementy z startIndex są usuwane na końcu tablicy.Istnieje również podobnie nazwana, ale inna funkcja
Array.prototype
:Array#slice
.Array # slice ([start [, end]])
Array#slice
jest nieniszczący i zwraca nową tablicę zawierającą wskazane indeksy odstart
doend
. Jeśliend
pozostanie nieokreślony, domyślnie znajdzie się na końcu tablicy. Jeśliend
jest dodatni, określa liczony od zera niewłączający indeks, na którym ma się zatrzymać. Jeśliend
jest ujemne, określa indeks, na którym ma się zatrzymać, odliczając od końca tablicy (np. -1 pominie indeks końcowy). Jeśliend <= start
wynikiem jest pusta tablica.Array # pop
Array#pop
usuwa ostatni element z tablicy i zwraca ten element. Ta operacja zmienia długość tablicy.źródło
delete
i wykonanie funkcji czyszczenia pamięci w celu wyczyszczenia.splice
w twoimremove
Array.prototype.remove = function(index) { this.splice(index, 1); };
Stare pytanie, nowoczesna odpowiedź. Korzystanie z funkcji restrukturyzacji obiektów, funkcji ECMAScript 6 , jest tak prosta, jak:
Lub z próbką pytań:
Możesz to zobaczyć w akcji w edytorze próbnym Babel.
Edytować:
Aby ponownie przypisać do tej samej zmiennej, użyj
let
:źródło
regex
można również przypisać do dowolnej innej zmiennej, np_
, co jest wykorzystywane w językach takich jak Go odrzucić wynik:const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
ale tak nie jest, więc nie sądzę, że jest to możliwe przy restrukturyzacji.freeze()
„dseal()
” nie można po prostudelete
właściwości. Jest to więc doskonała alternatywa. Chociaż w większości przypadków i tak prawdopodobnie nie ma sensu usuwanie właściwości z zamrożonego / zapieczętowanego obiektu, biorąc pod uwagę, że chodzi o to, aby zapewnić pewne gwarancje dotyczące twoich struktur danych, których wzór ten podważałby. W przypadkach, w których trzeba nieniszcząco zwielokrotnić obiekt, ale bez niektórych jego właściwości, jest to idealne rozwiązanieSpread Spreadax (ES6)
Ktokolwiek tego potrzebuje ...
Aby wypełnić odpowiedź @Koen w tym wątku, jeśli chcesz usunąć zmienną dynamiczną za pomocą składni spreadu, możesz to zrobić w następujący sposób:
*
foo
będzie nową zmienną o wartościa
(która wynosi 1).ROZSZERZONA ODPOWIEDŹ 😇
Istnieje kilka typowych sposobów usuwania właściwości z obiektu.
Każdy ma swoje zalety i wady ( sprawdź to porównanie wydajności ):
Usuń operatora
Czytelny i krótki, jednak może nie być najlepszym wyborem, jeśli operujesz na dużej liczbie obiektów, ponieważ jego wydajność nie jest zoptymalizowana.
Zmiana przypisania
Ponad 2 razy szybsza niż
delete
ta właściwośćniejestjednakusuwana i może być iterowana.Operator rozprzestrzeniania
Ten
ES6
operator pozwala nam zwrócić zupełnie nowy obiekt, z wyłączeniem jakichkolwiek właściwości, bez mutowania istniejącego obiektu. Minusem jest to, że ma gorszą wydajność z powyższego i nie sugeruje się go, gdy trzeba usunąć wiele właściwości na raz.źródło
Inną alternatywą jest użycie Underscore.js biblioteki .
Zauważ, że
_.pick()
i_.omit()
obaj powrót kopia obiektu, a nie bezpośrednio modyfikować oryginalnego obiektu. Przypisanie wyniku do oryginalnego obiektu powinno załatwić sprawę (nie pokazano).Odniesienie: link _.pick (obiekt, * klucze)
Zwraca kopię obiektu przefiltrowaną, aby zawierała tylko wartości kluczy z białej listy (lub tablicy prawidłowych kluczy).
Odniesienie: link _.omit (obiekt, * klucze)
Zwraca kopię obiektu przefiltrowaną w celu pominięcia kluczy z czarnej listy (lub tablicy kluczy).
Do tablic
_.filter()
i_.reject()
może być używany w podobny sposób.źródło
_.omit(collection, key.toString())
delete obj[prop]
które jest ~ 100x wolniejsze niżobj[prop] = undefined
.Termin użyty w tytule pytania
Remove a property from a JavaScript object
można interpretować na kilka różnych sposobów. Jednym z nich jest usunięcie go na całą pamięć i listę kluczy obiektu, a drugim po prostu usunięcie go z obiektu. Jak wspomniano w niektórych innych odpowiedziach,delete
słowo kluczowe jest główną częścią. Powiedzmy, że masz swój obiekt, taki jak:Jeśli zrobisz:
wynik byłby:
Możesz usunąć ten konkretny klucz ze swoich kluczy obiektowych, takich jak:
Następnie użyj klawiszy obiektów
Object.keys(myJSONObject)
będzie:Chodzi o to, że jeśli zależy ci na pamięci i chcesz, aby cały obiekt został usunięty z pamięci, zaleca się ustawienie wartości null przed usunięciem klucza:
Inną ważną kwestią jest uważanie na inne odniesienia do tego samego obiektu. Na przykład, jeśli utworzysz zmienną taką jak:
Lub dodaj go jako nowy wskaźnik do innego obiektu, takiego jak:
Wtedy nawet jeśli usuniesz go ze swojego obiektu
myJSONObject
, ten konkretny obiekt nie zostanie usunięty z pamięci, ponieważregex
zmienna imyOtherObject["regex"]
ma nadal swoje wartości. Jak więc na pewno moglibyśmy usunąć obiekt z pamięci?Odpowiedzią byłoby usunięcie wszystkich referencji, które masz w kodzie, wskazanie na ten sam obiekt, a także nie używanie
var
instrukcji do tworzenia nowych referencji do tego obiektu . Ten ostatni punkt dotyczącyvar
instrukcji jest jednym z najważniejszych problemów, z którymi zwykle mamy do czynienia, ponieważ użycievar
instrukcji uniemożliwiłoby usunięcie utworzonego obiektu.Co oznacza, że w tym przypadku nie będzie można usunąć tego obiektu, ponieważ
regex
zmienną utworzono za pomocąvar
instrukcji, a jeśli to zrobisz:Wynik byłby taki
false
, co oznacza, że twoja instrukcja usuwania nie została wykonana zgodnie z oczekiwaniami. Ale jeśli wcześniej nie tworzyłeś tej zmiennej, a byłeś tylkomyOtherObject["regex"]
ostatnim istniejącym odniesieniem, możesz to zrobić, usuwając ją w następujący sposób:Innymi słowy, obiekt JavaScript zostaje zabity, gdy tylko w kodzie nie ma odniesienia do tego obiektu.
Aktualizacja: Dzięki @AgentME:
Aby uzyskać więcej informacji na temat
Object.seal
: Object.seal ()źródło
myJSONObject.regex
wartość jest łańcuchem i przypisujesz ją do innego obiektu, drugi obiekt ma kopię tej wartości.ECMAScript 2015 (lub ES6) został wyposażony we wbudowany obiekt Reflect . Możliwe jest usunięcie właściwości obiektu poprzez wywołanie funkcji Reflect.deleteProperty () z obiektem docelowym i kluczem właściwości jako parametrami:
co jest równoważne z:
Ale jeśli właściwości obiektu nie można skonfigurować, nie można go usunąć ani za pomocą funkcji deleteProperty, ani operatora delete:
Object.freeze () powoduje, że wszystkie właściwości obiektu nie są konfigurowalne (poza innymi rzeczami).
deleteProperty
Funkcja (podobnie jak operator usuwania ) zwraca,false
gdy próbuje usunąć dowolną z jej właściwości. Jeśli właściwość jest konfigurowalna, zwracatrue
, nawet jeśli właściwość nie istnieje.Różnica między trybem ścisłym
delete
adeleteProperty
jest taka:źródło
apply
,call
,bind
funkcje ...Załóżmy, że masz obiekt, który wygląda następująco:
Usuwanie właściwości obiektu
Jeśli chcesz korzystać z całej
staff
tablicy, właściwym sposobem jest zrobienie tego:Możesz też to zrobić:
Podobnie usunięcie całej tablicy studentów byłoby wykonane przez wywołanie
delete Hogwarts.students;
lubdelete Hogwarts['students'];
.Usuwanie indeksu tablicy
Teraz, jeśli chcesz usunąć jednego członka personelu lub studenta, procedura jest nieco inna, ponieważ obie właściwości są same tablicami.
Jeśli znasz indeks swojego pracownika, możesz po prostu to zrobić:
Jeśli nie znasz indeksu, musisz również przeprowadzić wyszukiwanie indeksu:
Uwaga
Chociaż technicznie możesz użyć
delete
tablicy, użycie jej spowoduje niepoprawne wyniki podczas wywoływania, na przykładHogwarts.staff.length
później. Innymi słowy,delete
usunąłby element, ale nie zaktualizowałby wartościlength
właściwości. Użyciedelete
również popsułoby indeksowanie.Tak więc, usuwając wartości z obiektu, zawsze najpierw zastanów się, czy masz do czynienia z właściwościami obiektu, czy też z wartościami tablic i wybierz odpowiednią strategię na tej podstawie.
Jeśli chcesz z tym eksperymentować, możesz użyć tego skrzypka jako punktu wyjścia.
źródło
splice
na tablicy zamiastdelete
.delete
nie powinno być niczym. Właśniesplice
tego szukał OP.delete
powinien być używany do właściwości obiektów isplice
elementów tablicy.delete
tablic, najrozsądniej byłoby w ogóle nie tworzyć kodu wokół niego.Za pomocą ES6:
(Operator restrukturyzacji + spread)
źródło
Osobiście używam Underscore.js lub Lodash do manipulacji obiektami i tablicami:
źródło
Operator delete jest najlepszym sposobem, aby to zrobić.
Przykład na żywo do pokazania:
źródło
delete
operatora jest zdrowe w odniesieniu do zbierania śmieci , może być nieoczekiwanie powolne , w niemałej części z tego samego powodu.Aby sklonować obiekt bez właściwości:
Na przykład:
I musimy usunąć „a”.
1.Z wyraźnym kluczem prop:
2. Ze zmiennym kluczem prop:
3. funkcja strzałki Cool ool:
4. W przypadku wielu właściwości
Stosowanie
Lub
źródło
Najlepszą metodą jest użycie metody delete , zgodnie z opisem MDN operator delete usuwa właściwość z obiektu. Możesz więc po prostu napisać:
Poniższy fragment kodu stanowi kolejny prosty przykład:
Aby uzyskać więcej informacji i zobaczyć więcej przykładów, kliknij poniższy link:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
źródło
Inne rozwiązanie, przy użyciu
Array#reduce
.Jednak spowoduje to mutację oryginalnego obiektu. Jeśli chcesz utworzyć nowy obiekt bez określonego klucza, po prostu przypisz funkcję redukcji do nowej zmiennej, np .:
(ES6)
źródło
Ten post jest bardzo stary i uważam, że jest bardzo pomocny, dlatego zdecydowałem się udostępnić napisaną przeze mnie funkcję rozbrojenia, na wypadek, gdyby ktoś zobaczył ten post i pomyślał, dlaczego nie jest tak prosty, jak w przypadku PHP.
Powodem napisania tej nowej
unset
funkcji jest utrzymanie indeksu wszystkich innych zmiennych w tej hash_map. Spójrz na następujący przykład i zobacz, jak indeks „test2” nie zmienił się po usunięciu wartości z hash_map.źródło
Istnieje tutaj wiele dobrych odpowiedzi, ale chcę tylko zadzwonić, gdy przy usuwaniu właściwości w JavaScript używam delete, często mądrze jest najpierw sprawdzić, czy ta właściwość istnieje, aby zapobiec błędom.
Na przykład
Ze względu na dynamiczny charakter JavaScript często zdarza się, że po prostu nie wiesz, czy dana właściwość istnieje, czy nie. Sprawdzanie, czy obiekt istnieje przed &&, zapewnia również, że nie wyrzucisz błędu z powodu wywołania funkcji hasOwnProperty () na niezdefiniowanym obiekcie.
Przykro nam, jeśli nie dodało to konkretnego przypadku użycia, ale uważam, że jest to dobry projekt do dostosowania podczas zarządzania obiektami i ich właściwościami.
źródło
delete foo.bar;
zgłasza wyjątek tylko wtedy, gdy foo jest fałszem lub jeśli jesteś w trybie ścisłym, a foo jest obiektem z nieskonfigurowaną właściwością bar.Używając ramda # dissoc otrzymasz nowy obiekt bez atrybutu
regex
:Możesz także użyć innych funkcji, aby osiągnąć ten sam efekt - pomiń, wybierz, ...
źródło
Wypróbuj następującą metodę. Przypisz
Object
wartość właściwości doundefined
. Następniestringify
obiekt iparse
.źródło
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Jeśli chcesz usunąć właściwość głęboko zagnieżdżoną w obiekcie, możesz użyć następującej funkcji rekurencyjnej ze ścieżką do właściwości jako drugiego argumentu:
Przykład:
źródło
Możesz po prostu usunąć dowolną właściwość obiektu za pomocą
delete
słowa kluczowego.Na przykład:
Aby usunąć dowolną właściwość, powiedzmy
key1
, użyjdelete
słowa kluczowego takiego:Możesz też użyć notacji tablicowej:
Ref: MDN .
źródło
Object.assign () i Object.keys () & Array.map ()
źródło
Twierdzenie Dana, że „usuń” jest bardzo powolne, a opublikowany przez niego punkt odniesienia był wątpliwy. Więc sam przeprowadziłem test w Chrome 59. Wygląda na to, że „usuwanie” jest około 30 razy wolniejsze:
Zauważ, że celowo przeprowadziłem więcej niż jedną operację „usuń” w jednym cyklu pętli, aby zminimalizować efekt spowodowany przez inne operacje.
źródło
Zastanów się nad utworzeniem nowego obiektu bez
"regex"
właściwości, ponieważ do oryginalnego obiektu zawsze mogą odnosić się inne części programu. Dlatego należy unikać manipulowania nim.źródło
SyntaxError: Unexpected token '...'. Expected a property name.
?Usuwanie nieruchomości w JavaScript
Na tej stronie znajduje się wiele różnych opcji, nie dlatego, że większość opcji jest błędna - lub ponieważ odpowiedzi są duplikatami - ale dlatego, że odpowiednia technika zależy od sytuacji, w której się znajdujesz i celów zadań, które Ty i / lub Ty zespół stara się spełnić. Aby odpowiedzieć na twoje pytanie jednoznacznie, musisz wiedzieć:
Po udzieleniu odpowiedzi na te cztery pytania istnieją zasadniczo cztery kategorie „usuwania właściwości” w JavaScript, które można wybrać, aby osiągnąć swoje cele. Oni są:
Usuwanie właściwości obiektu mutującego, niebezpieczne
Ta kategoria służy do operowania literałami obiektów lub instancjami obiektów, gdy chcesz zachować / kontynuować używanie oryginalnego odwołania i nie używasz funkcjonalnych zasad bezstanowych w kodzie. Przykład składni w tej kategorii:
Ta kategoria jest najstarszą, najprostszą i najczęściej wspieraną kategorią usuwania nieruchomości. Obsługuje
Symbol
i indeksy tablic oprócz ciągów i działa w każdej wersji JavaScript z wyjątkiem pierwszej wersji. Jest to jednak mutacja, która narusza niektóre zasady programowania i ma wpływ na wydajność. Może także powodować nieprzechwycone wyjątki, gdy zostanie użyty w przypadku właściwości nieskonfigurowanych w trybie ścisłym .Pominięcie właściwości ciągu opartego na reszcie
Ta kategoria jest przeznaczona do działania na instancjach zwykłych obiektów lub tablic w nowszych wersjach ECMAScript, gdy pożądane jest podejście niemutujące i nie trzeba uwzględniać kluczy symboli:
Usuwanie właściwości obiektu mutującego, bezpieczne
Ta kategoria jest przeznaczona do operowania literałami obiektów lub instancjami obiektów, gdy chcesz zachować / kontynuować używanie oryginalnego odwołania, jednocześnie chroniąc przed wyjątkami zgłaszanymi przez nieskonfigurowalne właściwości:
Ponadto, podczas gdy mutowanie obiektów w miejscu nie jest bezstanowe, możesz użyć funkcjonalnej natury
Reflect.deleteProperty
częściowej aplikacji i innych technik funkcjonalnych, które nie są możliwe w przypadkudelete
instrukcji.Pominięcie właściwości ciągu na podstawie składni
Ta kategoria jest przeznaczona do działania na instancjach zwykłych obiektów lub tablic w nowszych wersjach ECMAScript, gdy pożądane jest podejście niemutujące i nie trzeba uwzględniać kluczy symboli:
Pominięcie właściwości na podstawie biblioteki
Ta kategoria ogólnie pozwala na większą elastyczność funkcjonalną, w tym rozliczanie symboli i pomijanie więcej niż jednej właściwości w jednym zestawieniu:
źródło
źródło
delete myObject.regex;
.Możesz użyć restrukturyzacji ES6 z operatorem odpoczynku.
Właściwości można usunąć za pomocą destrukcji w połączeniu z operatorem reszty . W twoim przykładzie wyrażenie regularne jest zniszczone (ignorowane), a reszta właściwości jest zwracana jako reszta.
Możesz też dynamicznie wykluczyć takie właściwości,
źródło
Możemy usunąć dowolną właściwość z obiektu javascript za pomocą:
przykład:
źródło
Spróbuj tego
źródło