7422 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];

9777voto

nickf Punkte 517253

Um eine Eigenschaft von einem Objekt zu entfernen (Mutation des Objekts), können Sie wie folgt vorgehen:

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

Demo

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

console.log(myObject);

Für alle, die mehr darüber lesen möchten, hat der Stack Overflow-Benutzer kangax hat einen unglaublich ausführlichen Blogbeitrag über die delete Erklärung in ihrem Blog, Verständnis für das Löschen . Es ist sehr empfehlenswert.

Wenn Sie eine neu Objekt mit allen Schlüsseln des Originals, außer einigen, zu erstellen, können Sie Destrukturierung .

Demo

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

const {regex, ...newObj} = myObject;

console.log(newObj);   // has no 'regex' key
console.log(myObject); // remains unchanged

20 Stimmen

Das ist eine nette Methode, aber nur gut, wenn Sie tatsächlich vorhaben, die regex ein, sonst beschwert sich eslint über eine unbenutzte Variable.

2 Stimmen

@Loolooii Sie können die Variable in Ihrer Destrukturierungszuweisung umbenennen, um Ihre argsIgnorePattern im no-unused-vars Regel. Ein leicht zu lösendes Problem.

4 Stimmen

Das Problem, das ich mit diesem Ansatz hatte, ist, dass, wenn die Zerstörung innerhalb einer Bedingung ist, es ESlint verrückt werden lässt.

1112voto

Dan Punkte 51805

Objekte in JavaScript kann man sich als Maps zwischen Schlüsseln und Werten vorstellen. Die delete Operator wird verwendet, um diese Schlüssel, besser bekannt als Objekteigenschaften, einen nach dem anderen zu entfernen.

var obj = {
  myProperty: 1    
}
console.log(obj.hasOwnProperty('myProperty')) // true
delete obj.myProperty
console.log(obj.hasOwnProperty('myProperty')) // false

Le site delete Operator gibt nicht direkt Speicher frei und unterscheidet sich vom einfachen Zuweisen des Wertes von null o undefined zu einer Eigenschaft, indem die Eigenschaft selbst aus dem Objekt entfernt wird. Beachten Sie, dass wenn die Wert Wenn es sich bei einer gelöschten Eigenschaft um einen Verweistyp (ein Objekt) handelt und ein anderer Teil Ihres Programms noch einen Verweis auf dieses Objekt enthält, wird dieses Objekt natürlich erst dann entsorgt, wenn alle Verweise darauf verschwunden sind.

delete funktioniert nur bei Eigenschaften, deren Deskriptor sie als konfigurierbar kennzeichnet.

401voto

Koen. Punkte 22804

Alte Frage, moderne Antwort. Mit Hilfe der Objektdestrukturierung kann ein ECMAScript 6 ist es so einfach wie:

const { a, ...rest } = { a: 1, b: 2, c: 3 };

Oder mit den Beispielfragen:

const myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};
const { regex, ...newObject } = myObject;
console.log(newObject);

Sie können es im Babel-Probe-Editor in Aktion sehen.


Editar:

Um die Zuweisung an dieselbe Variable zu ändern, verwenden Sie eine let :

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

3 Stimmen

Wie destrukturiere ich, wenn sich der Eigenschaftsname ändert, d.h. wenn ich ihn in einer Variablen habe?

1 Stimmen

Siehe diese Antwort unten; stackoverflow.com/a/52301527

4 Stimmen

Warum ist dies vorzuziehen gegenüber delete() ? "Modern" ist nicht wirklich ein Grund...

315voto

redsquare Punkte 76970
var myObject = {"ircEvent": "PRIVMSG", "method": "newURI", "regex": "^http://.*"};

delete myObject.regex;

console.log ( myObject.regex); // logs: undefined

Dies funktioniert in Firefox und Internet Explorer, und ich denke, es funktioniert in allen anderen.

298voto

Braden Best Punkte 8182

Le site delete Operator wird verwendet, um Eigenschaften von Objekten zu entfernen.

const obj = { foo: "bar" }
delete obj.foo
obj.hasOwnProperty("foo") // false

Beachten Sie, dass bei Arrays, dies ist nicht dasselbe wie das Entfernen eines Elements . Um ein Element aus einem Array zu entfernen, verwenden Sie Array#splice o Array#pop . Zum Beispiel:

arr // [0, 1, 2, 3, 4]
arr.splice(3,1); // 3
arr // [0, 1, 2, 4]

Detalles

delete in JavaScript hat eine andere Funktion als das Schlüsselwort in C und C++: Es gibt nicht direkt Speicher frei. Stattdessen besteht sein einziger Zweck darin, Eigenschaften von Objekten zu entfernen.

Bei Arrays erzeugt das Löschen einer Eigenschaft, die einem Index entspricht, ein spärliches Array (d.h. ein Array mit einem "Loch" darin). Die meisten Browser stellen diese fehlenden Array-Indizes als "leer" dar.

var array = [0, 1, 2, 3]
delete array[2] // [0, 1, empty, 3]

Beachten Sie, dass delete siedelt nicht um array[3] en array[2] .

Verschiedene integrierte Funktionen in JavaScript behandeln spärliche Arrays unterschiedlich.

  • for...in wird der leere Index komplett übersprungen.

  • Eine traditionelle for Schleife wird zurückgegeben undefined für den Wert am Index.

  • Jede Methode, die Symbol.iterator wird zurückgegeben undefined für den Wert am Index.

  • forEach , map et reduce wird der fehlende Index einfach übersprungen.

Also, die delete Operator sollte nicht für den üblichen Anwendungsfall des Entfernens von Elementen aus einem Array verwendet werden. Arrays haben eigene Methoden zum Entfernen von Elementen und zur Neuzuweisung von Speicher: Array#splice() et Array#pop .

Array#splice(start[, deleteCount[, item1[, item2[, ...]]]])

Array#splice ändert das Array und gibt alle entfernten Indizes zurück. deleteCount Elemente werden aus dem Index entfernt start y item1, item2... itemN werden in das Array ab dem Index start . Wenn deleteCount weggelassen wird, werden die Elemente ab startIndex bis zum Ende des Arrays entfernt.

let a = [0,1,2,3,4]
a.splice(2,2) // returns the removed elements [2,3]
// ...and `a` is now [0,1,4]

Es gibt auch eine ähnlich benannte, aber andere Funktion unter Array.prototype : Array#slice .

Array#Slice([Anfang[, Ende]])

Array#slice ist nicht destruktiv und gibt ein neues Array zurück, das die angegebenen Indizes von start zu end . Wenn end nicht angegeben wird, wird standardmäßig das Ende des Arrays verwendet. Wenn end positiv ist, gibt es die Null-basierte nicht-inklusive Index, bei dem angehalten werden soll. Wenn end negativ ist, gibt es den Index an, bei dem vom Ende des Arrays zurück gezählt wird (z.B. -1 lässt den letzten Index aus). Wenn end <= start ist das Ergebnis ein leeres Array.

let a = [0,1,2,3,4]
let slices = [
    a.slice(0,2),
    a.slice(2,2),
    a.slice(2,3),
    a.slice(2,5) ]

//   a           [0,1,2,3,4]
//   slices[0]   [0 1]- - -   
//   slices[1]    - - - - -
//   slices[2]    - -[3]- -
//   slices[3]    - -[2 4 5]

Array#pop

Array#pop entfernt das letzte Element aus einem Array und gibt dieses Element zurück. Dieser Vorgang ändert die Länge des Arrays.

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