Angenommen, ich erstelle ein Objekt wie folgt:
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI",
"regex": "^http://.*"
};
Was ist der beste Weg , um die Eigenschaft zu entfernen , regex
um am Ende mit neuem myObject
wie folgt?
let myObject = {
"ircEvent": "PRIVMSG",
"method": "newURI"
};
javascript
javascript-objects
Johnstok
quelle
quelle
delete
wäre dies die langsamste Option, da es sich eher um eine tatsächliche Operation als um die beiden anderen handelt, bei denen es sich nur um einfache Zuweisungen handelt. Der springende Punkt ist jedoch, dass das Zuweisen der Eigenschaft zum Objektnull
oderundefined
das Entfernen der Eigenschaft aus dem Objekt tatsächlich entfernt wird, sondern diese Eigenschaft auf einen bestimmten konstanten Wert gesetzt wird. (Die folgenden Antworten geben Gründe an, warum dies ein signifikanter Unterschied ist.)Antworten:
So was:
Demo
Für alle, die mehr darüber lesen möchten, hat der Stack Overflow-Benutzer kangax einen unglaublich ausführlichen Blog-Beitrag über die
delete
Aussage in seinem Blog " Löschen verstehen" geschrieben . Es wird dringend empfohlen.quelle
var x = {a : 'A', b : 'B'};
Vergleiche:delete x.a; typeof x.a; /* "undefined" */ x.hasOwnProperty('a'); /* false */
tox.b = undefined; typeof x.b; /* "undefined" */; x.hasOwnProperty('b'); /* true */
Objekte in JavaScript können als Zuordnungen zwischen Schlüsseln und Werten betrachtet werden. Der
delete
Operator wird verwendet, um diese Schlüssel, die allgemein als Objekteigenschaften bezeichnet werden, einzeln zu entfernen.Der
delete
Betreiber nicht direkt freier Speicher, und es unterscheidet sich von einfach den Wert der Zuweisungnull
oderundefined
einer Eigenschaft, dass die Eigenschaft sich von dem Objekt entfernt wird. Beachten Sie, dass, wenn der Wert einer gelöschten Eigenschaft ein Referenztyp (ein Objekt) war und ein anderer Teil Ihres Programms noch einen Verweis auf dieses Objekt enthält, dieses Objekt natürlich erst dann mit Müll belegt wird, wenn alle Verweise darauf vorhanden sind verschwunden.delete
funktioniert nur für Eigenschaften, deren Deskriptor sie als konfigurierbar markiert.quelle
Dies funktioniert in Firefox und Internet Explorer, und ich denke, es funktioniert in allen anderen.
quelle
Der
delete
Operator wird verwendet, um Eigenschaften von Objekten zu entfernen.Beachten Sie, dass dies für Arrays nicht mit dem Entfernen eines Elements identisch ist . Verwenden Sie
Array#splice
oder, um ein Element aus einem Array zu entfernenArray#pop
. Zum Beispiel:Einzelheiten
delete
in JavaScript hat eine andere Funktion als das Schlüsselwort in C und C ++: Es gibt keinen direkten Speicher frei. Stattdessen besteht der einzige Zweck darin, Eigenschaften von Objekten zu entfernen.Wenn Sie für Arrays eine Eigenschaft löschen, die einem Index entspricht, wird ein Array mit geringer Dichte erstellt (dh ein Array mit einem "Loch" darin). Die meisten Browser stellen diese fehlenden Array-Indizes als "leer" dar.
Beachten Sie, dass
delete
nicht in verlagertarray[3]
wirdarray[2]
.Verschiedene in JavaScript integrierte Funktionen behandeln spärliche Arrays unterschiedlich.
for...in
überspringt den leeren Index vollständig.Eine herkömmliche
for
Schleife gibtundefined
den Wert am Index zurück.Jede verwendete Methode
Symbol.iterator
gibtundefined
den Wert am Index zurück.forEach
,map
Undreduce
wird einfach die fehlenden Index überspringen.Daher sollte der
delete
Operator nicht für den allgemeinen Anwendungsfall des Entfernens von Elementen aus einem Array verwendet werden. Arrays verfügen über spezielle Methoden zum Entfernen von Elementen und zum Neuzuweisen von Speicher:Array#splice()
undArray#pop
.Array # splice (start [, deleteCount [, item1 [, item2 [, ...]]])
Array#splice
mutiert das Array und gibt alle entfernten Indizes zurück.deleteCount
Elemente werden aus dem Index entferntstart
, unditem1, item2... itemN
werden in das Array von Index eingefügtstart
. Wenn nichtdeleteCount
angegeben, werden Elemente aus startIndex bis zum Ende des Arrays entfernt.Es gibt auch eine ähnlich benannte, aber unterschiedliche Funktion für
Array.prototype
:Array#slice
.Array # Slice ([Anfang [, Ende]])
Array#slice
ist zerstörungsfrei und gibt ein neues Array zurück, das die angegebenen Indizes vonstart
bis enthältend
. Wennend
nicht angegeben, wird standardmäßig das Ende des Arrays verwendet. Wenn diesend
positiv ist, wird der auf Null basierende nicht inklusive Index angegeben, bei dem gestoppt werden soll. Wennend
es negativ ist, gibt es den Index an, bei dem angehalten werden soll, indem vom Ende des Arrays zurückgezählt wird (z. B. wird -1 den endgültigen Index weglassen). Wennend <= start
, ist das Ergebnis ein leeres Array.Array # pop
Array#pop
Entfernt das letzte Element aus einem Array und gibt dieses Element zurück. Diese Operation ändert die Länge des Arrays.quelle
delete
, eine Garbage Collection-Funktion zu verwenden und zu erstellen, um es zu bereinigen.splice
in Ihrer Bearbeitung,remove
sollte aber seinArray.prototype.remove = function(index) { this.splice(index, 1); };
Alte Frage, moderne Antwort. Mit der Objektdestrukturierung, einer ECMAScript 6- Funktion, ist dies so einfach wie:
Oder mit dem Fragenbeispiel:
Sie können es im Babel-Testeditor in Aktion sehen.
Bearbeiten:
Verwenden Sie a, um dieselbe Variable neu zuzuweisen
let
:quelle
regex
Sie es auch einer anderen Variablen zuweisen, z. B._
was in Sprachen wie Go verwendet wird, um ein Ergebnis zu verwerfen :const { regex: _, ...newObject } = myObject;
.const { [key], ...newObject } = myObject;
aber das tut es nicht, also denke ich nicht, dass es mit Destrukturierung möglich ist.freeze()
'd undseal()
' d Objekten können Sie nicht einfachdelete
eine Eigenschaft. Das ist also eine ausgezeichnete Alternative. Obwohl es in den meisten Fällen wahrscheinlich nicht sinnvoll ist, eine Eigenschaft aus einem eingefrorenen / versiegelten Objekt zu löschen, ist es wichtig, bestimmte Garantien für Ihre Datenstrukturen zu geben, die dieses Muster untergraben würden. Für die Fälle, in denen Sie ein Objekt zerstörungsfrei betrügen müssen, aber ohne einige seiner Eigenschaften, ist dies perfektSpread-Syntax (ES6)
Wer es braucht ...
Um die @ Ken-Antwort in diesem Thread zu vervollständigen, können Sie die folgenden Variablen wie folgt entfernen: Wenn Sie dynamische Variablen mithilfe der Spread-Syntax entfernen möchten:
*
foo
ist eine neue Variable mit dem Werta
(1).ERWEITERTE ANTWORT 😇
Es gibt nur wenige Möglichkeiten, eine Eigenschaft aus einem Objekt zu entfernen.
Jeder hat seine eigenen Vor- und Nachteile ( überprüfen Sie diesen Leistungsvergleich ):
Operator
löschen Lesbar und kurz, es ist jedoch möglicherweise nicht die beste Wahl, wenn Sie mit einer großen Anzahl von Objekten arbeiten, da die Leistung nicht optimiert ist.
Neuzuweisung
Mehr als 2X schneller als
delete
, die Eigenschaft wird jedochnichtgelöscht und kann wiederholt werden.Spread-Operator Mit
diesem
ES6
Operator können wir ein brandneues Objekt ohne Eigenschaften zurückgeben, ohne das vorhandene Objekt zu mutieren. Der Nachteil ist, dass es die schlechtere Leistung als oben beschrieben aufweist und nicht empfohlen wird, wenn Sie viele Eigenschaften gleichzeitig entfernen müssen.quelle
Eine andere Alternative ist die Verwendung der Bibliothek Underscore.js .
Beachten Sie, dass
_.pick()
und_.omit()
beide Rückkehr einer Kopie des Objekts und nicht direkt das ursprüngliche Objekt ändern. Das Zuweisen des Ergebnisses zum ursprünglichen Objekt sollte den Trick ausführen (nicht gezeigt).Referenz: link _.pick (Objekt, * Schlüssel)
Geben Sie eine Kopie des Objekts zurück, die so gefiltert ist, dass sie nur Werte für die Whitelist-Schlüssel (oder ein Array gültiger Schlüssel) enthält.
Referenz: link _.omit (Objekt, * Schlüssel)
Geben Sie eine Kopie des Objekts zurück, die gefiltert wurde, um die Schlüssel auf der schwarzen Liste (oder ein Array von Schlüsseln) wegzulassen.
Für Arrays
_.filter()
und_.reject()
kann auf ähnliche Weise verwendet werden.quelle
_.omit(collection, key.toString())
delete obj[prop]
~ 100x langsamer alsobj[prop] = undefined
.Der Begriff, den Sie in Ihrem Fragentitel verwendet haben
Remove a property from a JavaScript object
, kann auf verschiedene Arten interpretiert werden. Das eine ist, es für den gesamten Speicher zu entfernen und die Liste der Objektschlüssel oder das andere ist nur, es von Ihrem Objekt zu entfernen. Wie bereits in einigen anderen Antworten erwähnt, ist dasdelete
Schlüsselwort der Hauptteil. Angenommen, Sie haben Ihr Objekt wie folgt:Wenn Sie tun:
das Ergebnis wäre:
Sie können diesen bestimmten Schlüssel wie folgt aus Ihren Objektschlüsseln löschen:
Dann wäre Ihr Objektschlüssel mit
Object.keys(myJSONObject)
:Wenn Sie sich jedoch für den Speicher interessieren und das gesamte Objekt aus dem Speicher entfernen möchten, wird empfohlen, es vor dem Löschen des Schlüssels auf null zu setzen:
Der andere wichtige Punkt hier ist, vorsichtig mit Ihren anderen Verweisen auf dasselbe Objekt umzugehen. Zum Beispiel, wenn Sie eine Variable erstellen wie:
Oder fügen Sie es als neuen Zeiger auf ein anderes Objekt hinzu, wie:
Dann auch, wenn Sie es von Ihrem Objekt entfernen
myJSONObject
, wird dieses bestimmte Objekt nicht aus dem Speicher gelöscht, da dieregex
VariablemyOtherObject["regex"]
immer noch ihre Werte hat. Wie können wir dann das Objekt sicher aus dem Speicher entfernen?Die Antwort wäre, alle Referenzen zu löschen, die Sie in Ihrem Code haben, auf genau dieses Objekt verweisen und auch keine
var
Anweisungen verwenden, um neue Referenzen auf dieses Objekt zu erstellen . Dieser letzte Punkt in Bezug aufvar
Anweisungen ist eines der wichtigsten Probleme, mit denen wir normalerweise konfrontiert sind, da die Verwendung vonvar
Anweisungen verhindern würde, dass das erstellte Objekt entfernt wird.In diesem Fall können Sie dieses Objekt nicht entfernen, da Sie die
regex
Variable über einevar
Anweisung erstellt haben. Wenn Sie dies tun:Das Ergebnis wäre
false
, was bedeutet, dass Ihre Löschanweisung nicht wie erwartet ausgeführt wurde. Wenn Sie diese Variable jedoch noch nicht erstellt hätten und sie nurmyOtherObject["regex"]
als letzte vorhandene Referenz verwendet hätten, hätten Sie dies einfach tun können, indem Sie sie wie folgt entfernen:Mit anderen Worten, ein JavaScript-Objekt wird getötet, sobald in Ihrem Code kein Verweis mehr auf dieses Objekt vorhanden ist.
Aktualisieren: Danke an @AgentME:
Weitere Informationen zu
Object.seal
: Object.seal ()quelle
myJSONObject.regex
der Wert also eine Zeichenfolge ist und Sie ihn einem anderen Objekt zuweisen, verfügt das andere Objekt über eine Kopie dieses Werts.ECMAScript 2015 (oder ES6) wurde mit einem integrierten Reflect- Objekt geliefert . Sie können die Objekteigenschaft löschen, indem Sie die Funktion Reflect.deleteProperty () mit dem Zielobjekt und dem Eigenschaftsschlüssel als Parametern aufrufen :
was äquivalent ist zu:
Wenn die Eigenschaft des Objekts jedoch nicht konfigurierbar ist, kann sie weder mit der Funktion deleteProperty noch mit dem Löschoperator gelöscht werden:
Object.freeze () macht alle Eigenschaften des Objekts (neben anderen Dingen) nicht konfigurierbar.
deleteProperty
Die Funktion (sowie der Löschoperator ) wird zurückgegeben,false
wenn versucht wird, eine ihrer Eigenschaften zu löschen. Wenn die Eigenschaft konfigurierbar ist, wird sie zurückgegebentrue
, auch wenn die Eigenschaft nicht vorhanden ist.Der Unterschied zwischen
delete
unddeleteProperty
besteht bei Verwendung des strengen Modus:quelle
apply
,call
,bind
Funktionen ...Angenommen, Sie haben ein Objekt, das so aussieht:
Löschen einer Objekteigenschaft
Wenn Sie das gesamte
staff
Array verwenden möchten , ist dies der richtige Weg:Alternativ können Sie auch Folgendes tun:
In ähnlicher Weise würde das Entfernen des gesamten Schülerarrays durch Aufrufen von
delete Hogwarts.students;
oder erfolgendelete Hogwarts['students'];
.Löschen eines Array-Index
Wenn Sie nun einen einzelnen Mitarbeiter oder Schüler entfernen möchten, ist die Vorgehensweise etwas anders, da beide Eigenschaften selbst Arrays sind.
Wenn Sie den Index Ihres Mitarbeiters kennen, können Sie dies einfach tun:
Wenn Sie den Index nicht kennen, müssen Sie auch eine Indexsuche durchführen:
Hinweis
Während Sie es technisch
delete
für ein Array verwenden können, würde die Verwendung dieses Arrays zu falschen Ergebnissen führen, wenn Sie beispielsweiseHogwarts.staff.length
später aufrufen . Mit anderen Worten,delete
würde das Element entfernen, aber den Wert derlength
Eigenschaft nicht aktualisieren . Die Verwendungdelete
würde auch Ihre Indizierung durcheinander bringen.Überlegen Sie beim Löschen von Werten aus einem Objekt immer zuerst, ob es sich um Objekteigenschaften oder um Array-Werte handelt, und wählen Sie darauf basierend die entsprechende Strategie aus.
Wenn Sie damit experimentieren möchten, können Sie diese Geige als Ausgangspunkt verwenden.
quelle
splice
auf einem Array anstelle von verwendendelete
.delete
das nicht einmal eine Sache sein sollte. Essplice
ist das, wonach das OP gesucht hat.delete
sollte für Objekteigenschaften undsplice
für Array-Elemente verwendet werden.delete
Arrays verwendet werden sollte, wäre es am klügsten, überhaupt keinen Code zu erstellen, der darauf zentriert ist.Verwenden von ES6:
(Destructuring + Spread Operator)
quelle
Ich persönlich benutze Underscore.js oder Lodash für die Manipulation von Objekten und Arrays:
quelle
Der Löschoperator ist der beste Weg, dies zu tun.
Ein Live-Beispiel zu zeigen:
quelle
delete
Operators zwar in Bezug auf die Speicherbereinigung fehlerfrei ist , jedoch unerwartet langsam sein kann , nicht zuletzt aus demselben Grund.So klonen Sie ein Objekt ohne Eigenschaft:
Zum Beispiel:
Und wir müssen 'a' löschen.
1.Mit explizitem Requisitschlüssel:
2.Mit variablem Propellerschlüssel:
3.Kühlpfeilfunktion 😎:
4. Für mehrere Eigenschaften
Verwendungszweck
Oder
quelle
Die Löschmethode ist der beste Weg, um dies zu tun. Gemäß der MDN-Beschreibung entfernt der Löschoperator eine Eigenschaft aus einem Objekt. Sie können also einfach schreiben:
Das folgende Snippet gibt ein weiteres einfaches Beispiel:
Weitere Informationen und Beispiele finden Sie unter folgendem Link:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete
quelle
Eine andere Lösung mit
Array#reduce
.Das ursprüngliche Objekt wird jedoch mutiert . Wenn Sie ein neues Objekt ohne den angegebenen Schlüssel erstellen möchten , weisen Sie die Reduzierungsfunktion einfach einer neuen Variablen zu, z.
(ES6)
quelle
Dieser Beitrag ist sehr alt und ich finde ihn sehr hilfreich. Deshalb habe ich beschlossen, die nicht gesetzte Funktion, die ich geschrieben habe, zu teilen, falls jemand anderes diesen Beitrag sieht und darüber nachdenkt, warum er nicht so einfach ist wie in der nicht gesetzten PHP-Funktion.
Der Grund für das Schreiben dieser neuen
unset
Funktion besteht darin, den Index aller anderen Variablen in dieser hash_map beizubehalten. Schauen Sie sich das folgende Beispiel an und sehen Sie, wie sich der Index von "test2" nach dem Entfernen eines Werts aus der hash_map nicht geändert hat.quelle
Hier gibt es viele gute Antworten, aber ich möchte nur darauf hinweisen, dass es bei der Verwendung von delete zum Entfernen einer Eigenschaft in JavaScript häufig ratsam ist, zunächst zu überprüfen, ob diese Eigenschaft vorhanden ist, um Fehler zu vermeiden.
Z.B
Aufgrund der Dynamik von JavaScript gibt es häufig Fälle, in denen Sie einfach nicht wissen, ob die Eigenschaft vorhanden ist oder nicht. Wenn Sie überprüfen, ob obj vor dem && vorhanden ist, stellen Sie außerdem sicher, dass Sie keinen Fehler auslösen, wenn Sie die Funktion hasOwnProperty () für ein undefiniertes Objekt aufrufen.
Es tut uns leid, wenn dies nicht zu Ihrem speziellen Anwendungsfall beigetragen hat, aber ich glaube, dass dies ein gutes Design ist, das Sie beim Verwalten von Objekten und ihren Eigenschaften anpassen können.
quelle
delete foo.bar;
Löst nur dann eine Ausnahme aus, wenn foo falsch ist oder wenn Sie sich im strengen Modus befinden und foo ein Objekt mit einer nicht konfigurierbaren Balkeneigenschaft ist.Mit ramda # dissoc erhalten Sie ein neues Objekt ohne das Attribut
regex
:Sie können auch andere Funktionen verwenden, um den gleichen Effekt zu erzielen - weglassen, auswählen, ...
quelle
Versuchen Sie die folgende Methode. Weisen Sie den
Object
Eigenschaftswert zuundefined
. Dannstringify
das Objekt undparse
.quelle
JSON.parse(JSON.stringify({ ...myObject, regex: undefined }))
Wenn Sie eine tief im Objekt verschachtelte Eigenschaft löschen möchten, können Sie die folgende rekursive Funktion mit dem Pfad zur Eigenschaft als zweites Argument verwenden:
Beispiel:
quelle
Sie können einfach jede Eigenschaft eines Objekts mit dem
delete
Schlüsselwort löschen .Zum Beispiel:
key1
Verwenden Sie beispielsweise das folgendedelete
Schlüsselwort, um eine Eigenschaft zu entfernen :Oder Sie können auch eine Array-ähnliche Notation verwenden:
Ref: MDN .
quelle
Object.assign () & Object.keys () & Array.map ()
quelle
Dans Behauptung, dass "Löschen" sehr langsam ist und der von ihm veröffentlichte Benchmark wurde angezweifelt. Also habe ich den Test selbst in Chrome 59 durchgeführt. Es scheint, dass "Löschen" etwa 30-mal langsamer ist:
Beachten Sie, dass ich absichtlich mehr als eine Löschoperation in einem Schleifenzyklus ausgeführt habe, um den durch die anderen Operationen verursachten Effekt zu minimieren.
quelle
Ziehen Sie in Betracht, ein neues Objekt ohne die
"regex"
Eigenschaft zu erstellen, da das ursprüngliche Objekt immer von anderen Teilen Ihres Programms referenziert werden kann. Daher sollten Sie es vermeiden, es zu manipulieren.quelle
SyntaxError: Unexpected token '...'. Expected a property name.
?Entfernen von Eigenschaften in JavaScript
Auf dieser Seite werden viele verschiedene Optionen vorgestellt, nicht weil die meisten Optionen falsch sind - oder weil die Antworten doppelt sind -, sondern weil die geeignete Technik von der Situation und den Zielen der Aufgaben abhängt, die Sie und / oder Sie haben Team versuchen zu erfüllen. Um Ihre Frage eindeutig zu beantworten, muss man wissen:
Sobald diese vier Fragen beantwortet wurden, können Sie in JavaScript im Wesentlichen vier Kategorien für das Entfernen von Eigenschaften auswählen, um Ihre Ziele zu erreichen. Sie sind:
Löschen mutativer Objekteigenschaften, unsicher
Diese Kategorie dient zum Bearbeiten von Objektliteralen oder Objektinstanzen, wenn Sie die ursprüngliche Referenz beibehalten / weiterhin verwenden möchten und keine zustandslosen Funktionsprinzipien in Ihrem Code verwenden. Ein Beispiel für eine Syntax in dieser Kategorie:
Diese Kategorie ist die älteste, unkomplizierteste und am weitesten verbreitete Kategorie der Entfernung von Eigentum. Es unterstützt
Symbol
& Array-Indizes zusätzlich zu Zeichenfolgen und funktioniert in jeder Version von JavaScript mit Ausnahme der allerersten Version. Es ist jedoch eine Mutation, die gegen einige Programmierprinzipien verstößt und Auswirkungen auf die Leistung hat. Es kann auch zu nicht erfassten Ausnahmen führen, wenn nicht konfigurierbare Eigenschaften im strengen Modus verwendet werden .Auslassungsbasierte Auslassung von Zeichenfolgeneigenschaften
Diese Kategorie ist für den Betrieb mit einfachen Objekt- oder Array-Instanzen in neueren ECMAScript-Varianten vorgesehen, wenn ein nicht mutativer Ansatz gewünscht wird und Sie keine Symbolschlüssel berücksichtigen müssen:
Löschen mutativer Objekteigenschaften, sicher
Diese Kategorie dient zum Bearbeiten von Objektliteralen oder Objektinstanzen, wenn Sie die ursprüngliche Referenz beibehalten / weiterhin verwenden möchten, während Sie verhindern möchten, dass Ausnahmen für nicht konfigurierbare Eigenschaften ausgelöst werden:
Während das Mutieren von Objekten an Ort und Stelle nicht zustandslos ist, können Sie die funktionale Natur von verwenden
Reflect.deleteProperty
, um Teilanwendungen und andere funktionale Techniken auszuführen, die mitdelete
Anweisungen nicht möglich sind .Auslassen einer syntaxbasierten Zeichenfolgeeigenschaft
Diese Kategorie ist für den Betrieb mit einfachen Objekt- oder Array-Instanzen in neueren ECMAScript-Varianten vorgesehen, wenn ein nicht mutativer Ansatz gewünscht wird und Sie keine Symbolschlüssel berücksichtigen müssen:
Auslassung bibliotheksbasierter Eigenschaften
Diese Kategorie ermöglicht im Allgemeinen eine größere funktionale Flexibilität, einschließlich der Berücksichtigung von Symbolen und des Weglassens von mehr als einer Eigenschaft in einer Anweisung:
quelle
quelle
delete myObject.regex;
.Sie können die ES6-Destrukturierung mit dem Restoperator verwenden.
Eigenschaften können durch Destrukturierung in Kombination mit dem Restoperator entfernt werden . In Ihrem Beispiel wird Regex zerstört (ignoriert) und der Rest der Eigenschaften wird als Rest zurückgegeben.
Oder Sie können Eigenschaften wie diese dynamisch ausschließen.
quelle
Wir können jede Eigenschaft aus einem Javascript-Objekt entfernen, indem wir Folgendes verwenden:
Beispiel:
quelle
Versuche dies
quelle