7548 Stimmen

Wie kann ich eine Eigenschaft aus einem JavaScript-Objekt entfernen?

Angenommen, ich erstelle ein Objekt wie folgt:

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI",
  "regex": "^http://.*"
};

Wie sollte ich die Immobilie entfernen? regex um am Ende mit neuen myObject wie folgt?

let myObject = {
  "ircEvent": "PRIVMSG",
  "method": "newURI"
};

0 Stimmen

Delete myObject.regex; // oder, delete myObject['regex']; // oder, var prop = "regex"; delete myObject[prop];

277voto

Lior Elrom Punkte 17362

Spread-Syntax (ES6)

Zum Ausfüllen Koen's Antwort Wenn Sie eine dynamische Variable mit der Spread-Syntax entfernen möchten, können Sie dies wie folgt tun:

const key = 'a';

const { [key]: foo, ...rest } = { a: 1, b: 2, c: 3 };

console.log(foo);  // 1
console.log(rest); // { b: 2, c: 3 }

* foo wird eine neue Variable mit dem Wert von a (die 1 ist).

Erweiterte Antwort

Es gibt einige gängige Möglichkeiten, eine Eigenschaft aus einem Objekt zu entfernen.
Jede hat ihre eigenen Vor- und Nachteile ( Prüfen Sie diesen Leistungsvergleich ):

Operator löschen

Sie ist lesbar und kurz, aber möglicherweise nicht die beste Wahl, wenn Sie mit einer großen Anzahl von Objekten arbeiten, da ihre Leistung nicht optimiert ist.

delete obj[key];

Neuzuweisung

Es ist mehr als zwei Mal schneller als delete jedoch ist die Eigenschaft pas gelöscht und können iteriert werden.

obj[key] = null;
obj[key] = false;
obj[key] = undefined;

Spread Operator

Este ES6 Operator ermöglicht es uns, ein völlig neues Objekt ohne Eigenschaften zurückzugeben, ohne das bestehende Objekt zu verändern. Der Nachteil ist, dass er die schlechteste Leistung der oben genannten Operatoren hat und nicht empfohlen wird, wenn Sie viele Eigenschaften auf einmal entfernen müssen.

{ [key]: val, ...rest } = obj;

5 Stimmen

Dabei wird die Eigenschaft nicht entfernt, sondern eine flache Kopie erstellt und nicht der angegebene Schlüssel und Wert kopiert. Das ist ein sehr großer Unterschied.

128voto

Thaddeus Albers Punkte 3826

Eine weitere Alternative ist die Verwendung der Underscore.js Bibliothek.

Beachten Sie, dass _.pick() et _.omit() geben beide eine Kopie des Objekts zurück und verändern das Originalobjekt nicht direkt. Die Zuweisung des Ergebnisses an das Originalobjekt sollte ausreichen (nicht gezeigt).

Referenz: Link _.pick(object, *keys)

Gibt eine Kopie des Objekts zurück, gefiltert um nur Werte für die Schlüssel der Whitelist (oder ein Array gültiger Schlüssel).

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.pick(myJSONObject, "ircEvent", "method");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

Referenz: Link _.omit(object, *keys)

Gibt eine Kopie des Objekts zurück, gefiltert, um die gefilterten Schlüssel (oder Array von Schlüsseln).

var myJSONObject = 
{"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

_.omit(myJSONObject, "regex");
=> {"ircEvent": "PRIVMSG", "method": "newURI"};

Für Arrays, _.filter() et _.reject() kann in ähnlicher Weise verwendet werden.

124voto

YairTawil Punkte 3488

Zum Klonen eines Objekts ohne eine Eigenschaft:

Zum Beispiel:

let object = { a: 1, b: 2, c: 3 };

Und wir müssen löschen a .

  1. Mit einer eindeutiger Requisitenschlüssel :

    const { a, ...rest } = object;
    object = rest;
  2. Mit einem variabler Stützenschlüssel :

    const propKey = 'a';
    const { [propKey]: propValue, ...rest } = object;
    object = rest;
  3. Ein kühles Pfeilfunktion :

     const removeProperty = (propKey, { [propKey]: propValue, ...rest }) => rest;
    
     object = removeProperty('a', object);
  4. Para mehrere Objekte

    const removeProperties = (object, ...keys) => (keys.length ? removeProperties(removeProperty(keys.pop(), object), ...keys) : object);

Verwendung

object = removeProperties(object, 'a', 'b') // result => { c: 3 }

Oder

    const propsToRemove = ['a', 'b']
    object = removeProperties(object, ...propsToRemove) // result => { c: 3 }

82voto

Mehran Hatami Punkte 12327

Der Begriff, den Sie im Titel Ihrer Frage verwendet haben, Entfernen einer Eigenschaft aus einem JavaScript-Objekt kann auf verschiedene Weise interpretiert werden. Die eine ist, es für den gesamten Speicher und die Liste der Objektschlüssel zu entfernen oder die andere ist, es einfach aus Ihrem Objekt zu entfernen. Wie bereits in einigen anderen Antworten erwähnt wurde, ist die delete Das Schlüsselwort ist der wichtigste Teil. Nehmen wir an, Sie haben Ihr Objekt wie:

myJSONObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

Wenn Sie das tun:

console.log(Object.keys(myJSONObject));

wäre das Ergebnis:

["ircEvent", "method", "regex"]

Sie können diesen speziellen Schlüssel aus Ihren Objektschlüsseln löschen:

delete myJSONObject["regex"];

Dann werden Ihre Objekte mit dem Schlüssel Object.keys(myJSONObject) wäre:

["ircEvent", "method"]

Aber der Punkt ist, wenn Sie sich um den Speicher kümmern und Sie wollen, dass das Objekt ganz aus dem Speicher entfernt wird, ist es empfehlenswert, es auf null zu setzen, bevor Sie den Schlüssel löschen:

myJSONObject["regex"] = null;
delete myJSONObject["regex"];

Ein weiterer wichtiger Punkt ist, dass Sie auf Ihre anderen Verweise auf dasselbe Objekt achten müssen. Wenn Sie zum Beispiel eine Variable wie:

var regex = myJSONObject["regex"];

Oder fügen Sie ihn als neuen Zeiger auf ein anderes Objekt hinzu:

var myOtherObject = {};
myOtherObject["regex"] = myJSONObject["regex"];

Auch wenn Sie es aus Ihrem Objekt entfernen myJSONObject wird dieses spezifische Objekt nicht aus dem Speicher gelöscht, da die regex variabel und myOtherObject["regex"] haben immer noch ihre Werte. Wie könnten wir dann das Objekt sicher aus dem Speicher entfernen?

Die Antwort würde lauten alle Verweise in Ihrem Code löschen, die auf dieses Objekt verweisen und auch nicht verwenden var Anweisungen, um neue Verweise auf dieses Objekt zu erstellen . Dieser letzte Punkt bezüglich var ist eine der wichtigsten Fragen, mit denen wir normalerweise konfrontiert werden, denn die Verwendung von var Anweisungen würden verhindern, dass das erstellte Objekt entfernt wird.

Das bedeutet, dass Sie in diesem Fall nicht in der Lage sein werden, das Objekt zu entfernen, da Sie die regex Variable über eine var Aussage, und wenn Sie das tun:

delete regex; //False

Das Ergebnis wäre false , was bedeutet, dass Ihre Löschanweisung nicht wie erwartet ausgeführt wurde. Hätten Sie diese Variable jedoch vorher nicht erstellt und nur myOtherObject["regex"] als letzten bestehenden Verweis zu verwenden, hätten Sie dies auch einfach durch Entfernen des Verweises tun können:

myOtherObject["regex"] = null;
delete myOtherObject["regex"];

Mit anderen Worten: Ein JavaScript-Objekt wird gelöscht, sobald in Ihrem Code kein Verweis mehr auf dieses Objekt vorhanden ist.


Aktualisierung:

Dank an @AgentME:

Das Setzen einer Eigenschaft auf Null vor dem Löschen bewirkt nicht, dass nichts (es sei denn, das Objekt wurde mit Object.seal versiegelt und das Löschen fehlschlägt. Das ist normalerweise nicht der Fall, es sei denn, man versucht es ausdrücklich versuchen).

Für weitere Informationen über Object.seal : Object.seal()

57voto

madox2 Punkte 44607

ECMAScript 2015 (oder ES6) wurde mit integrierten Reflektieren Gegenstand. Es ist möglich, Objekteigenschaften zu löschen, indem man Reflect.deleteProperty() Funktion mit Zielobjekt und Eigenschaftsschlüssel als Parameter:

Reflect.deleteProperty(myJSONObject, 'regex');

was gleichbedeutend ist mit:

delete myJSONObject['regex'];

Wenn die Eigenschaft des Objekts jedoch nicht konfigurierbar ist, kann sie weder mit der Funktion deleteProperty noch mit dem Operator delete gelöscht werden:

let obj = Object.freeze({ prop: "value" });
let success = Reflect.deleteProperty(obj, "prop");
console.log(success); // false
console.log(obj.prop); // value

Objekt.einfrieren() macht alle Eigenschaften des Objekts nicht konfigurierbar (neben anderen Dingen). deleteProperty Funktion (wie auch die Löschoperator ) gibt zurück false wenn er versucht, eine seiner Eigenschaften zu löschen. Wenn die Eigenschaft konfigurierbar ist, wird true auch wenn kein Eigentum vorhanden ist.

Der Unterschied zwischen delete et deleteProperty ist, wenn der strenge Modus verwendet wird:

"use strict";

let obj = Object.freeze({ prop: "value" });
Reflect.deleteProperty(obj, "prop"); // false
delete obj["prop"];
// TypeError: property "prop" is non-configurable and can't be deleted

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X