224 Stimmen

Wie kann man ein JavaScript-Objekt schnell löschen?

Mit einem JavaScript-Array kann ich es mit einer einzigen Zuweisung auf einen leeren Zustand zurücksetzen:

array.length = 0;

Dadurch erscheint das Array leer und kann wiederverwendet werden, und soweit ich weiß, handelt es sich um eine einzige "Operation", d. h. um eine konstante Zeit.

Gibt es eine ähnliche Möglichkeit, ein JS-Objekt zu löschen? Ich weiß, ich kann seine Felder durchlaufen und sie löschen:

for (var prop in obj) { if (obj.hasOwnProperty(prop)) { delete obj[prop]; } }

aber dies hat eine lineare Komplexität.

Ich kann das Objekt auch einfach wegwerfen und ein neues erstellen:

obj = {};

Aber "promiscuous" Erstellung von neuen Objekten führt zu Problemen mit Garbage Collection auf IE6. ( Wie hier beschrieben )

152voto

Wytze Punkte 7682

Nun, auf die Gefahr hin, dass ich es mir zu einfach mache...

for (var member in myObject) delete myObject[member];

...scheint ziemlich effektiv zu sein, um das Objekt in einer einzigen Codezeile mit einem Minimum an furchterregenden Klammern zu bereinigen. Alle Mitglieder werden wirklich gelöscht und nicht als Müll zurückgelassen.

Wenn Sie das Objekt selbst löschen wollen, müssen Sie dafür natürlich ein separates delete() ausführen.

78voto

Estus Flask Punkte 176276

ES5

ES5-Lösung sein kann:

// for enumerable and non-enumerable properties
Object.getOwnPropertyNames(obj).forEach(function (prop) {
  delete obj[prop];
});

ES6

Und ES6-Lösung kann sein:

// for enumerable and non-enumerable properties
for (const prop of Object.getOwnPropertyNames(obj)) {
  delete obj[prop];
}

Leistung

Unabhängig von den technischen Daten sind die schnellsten Lösungen in der Regel die folgenden:

// for enumerable and non-enumerable of an object with proto chain
var props = Object.getOwnPropertyNames(obj);
for (var i = 0; i < props.length; i++) {
  delete obj[props[i]];
}

// for enumerable properties of shallow/plain object
for (var key in obj) {
  // this check can be safely omitted in modern JS engines
  // if (obj.hasOwnProperty(key))
    delete obj[key];
}

Der Grund dafür for..in nur bei flachen oder einfachen Objekten durchgeführt werden sollte, ist, dass es die Eigenschaften durchläuft, die prototypisch vererbt werden, und nicht nur die eigenen Eigenschaften, die gelöscht werden können. Für den Fall, dass nicht sicher ist, dass ein Objekt einfach ist und die Eigenschaften aufzählbar sind, for con Object.getOwnPropertyNames ist eine bessere Wahl.

62voto

jthompson Punkte 6842

Die kurze Antwort auf Ihre Frage ist, denke ich, nein (Sie können einfach ein neues Objekt erstellen).

  1. In diesem Beispiel glaube ich, dass durch die Einstellung der Länge auf 0 noch alle Elemente für die Garbage Collection übrig bleiben.

  2. Sie könnten dies zu Object.prototype hinzufügen, wenn es etwas ist, das Sie häufig verwenden würden. Ja, es ist linear in der Komplexität, aber alles, was nicht tun, Garbage Collection später wird sein.

  3. Dies ist die beste Lösung. Ich weiß, es hat nichts mit Ihrer Frage zu tun - aber wie lange müssen wir den IE6 noch unterstützen? Es gibt viele Kampagnen, um die Verwendung von IE6 einzustellen.

Bitte korrigieren Sie mich, wenn etwas falsch ist.

15voto

Siegh Punkte 71

Das ist der einfachste Weg:

Object.keys(object).forEach(key => {
  delete object[key];
})

Object.keys gibt jeden Schlüssel des Objekts als Array zurück, zum Beispiel:

const user = {
  name: 'John Doe',
  age: 25,
};

Object.keys(user) // ['name', 'age']

forEach wird die Funktion im ersten Parameter für jedes Element ausgeführt, und die delete Schlüsselwort löscht einen Schlüssel aus einem Objekt. Daher löscht der Code einen Schlüssel des Objekts für jeden Schlüssel.

10voto

Alina Poluykova Punkte 135

Sie können dies versuchen. Die folgende Funktion setzt alle Werte der Objekteigenschaften auf undefiniert. Funktioniert auch mit verschachtelten Objekten.

var clearObjectValues = (objToClear) => {
    Object.keys(objToClear).forEach((param) => {
        if ( (objToClear[param]).toString() === "[object Object]" ) {
            clearObjectValues(objToClear[param]);
        } else {
            objToClear[param] = undefined;
        }
    })
    return objToClear;
};

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