703 Stimmen

Wie kann ich Objekte aus einem assoziativen JavaScript-Array entfernen?

Angenommen, ich habe diesen Code:

var myArray = new Object();
myArray["firstname"] = "Bob";
myArray["lastname"] = "Smith";
myArray["age"] = 25;

Wenn ich nun "Nachname" entfernen möchte?....gibt es eine Entsprechung von myArray["lastname"].remove() ?

(Ich brauche das Element nicht, weil die Anzahl der Elemente wichtig ist und ich die Dinge sauber halten möchte).

32 Stimmen

Ein Tipp: Verwechseln Sie nicht Arrays und Maps. Einige Sprachen, wie php, haben ein einziges Objekt für beide. Obwohl Sie hier den richtigen Typ verwendet haben (new Object()), haben Sie es myArray genannt, es ist nur eine Frage der Standards einer Sprache.

0 Stimmen

Vergessen Sie nicht, dass JavaScript typfrei ist und alles ein Objekt ist. Siehe die Antwort von Saul unten.

4 Stimmen

@StephanKristyn - um genau zu sein, hat JS Typen, aber in einer dynamisch et schwach Weise. Zum Beispiel sind die Variablen in der Tat typfrei, ihre Werte jedoch nicht. Das ist die dynamisch Teil. Schwach bedeutet, dass Operationen zwischen verschiedenen Werttypen sind nicht genau definiert und beruhen auf Konvertierungen im Hintergrund; zum Beispiel "Test" + {}; ist eine vollkommen gültige JS-Anweisung.

1254voto

Dennis C Punkte 23918

Objekte in JavaScript kann man sich als assoziative Arrays vorstellen, die Schlüssel (Eigenschaften) auf Werte abbilden.

Um eine Eigenschaft aus einem Objekt in JavaScript zu entfernen, verwenden Sie die delete Betreiber:

const o = { lastName: 'foo' }
o.hasOwnProperty('lastName') // true
delete o['lastName']
o.hasOwnProperty('lastName') // false

Beachten Sie, dass, wenn delete auf eine Indexeigenschaft einer Array erstellen Sie eine dünn besiedeltes Feld (d. h. ein Array mit einem fehlenden Index).

Bei der Arbeit mit Instanzen von Array Wenn Sie kein dünn besiedeltes Array erstellen wollen - und das wollen Sie in der Regel nicht - dann sollten Sie Array#splice ou Array#pop .

Beachten Sie, dass die delete Operator in JavaScript gibt nicht direkt Speicher frei. Sein Zweck ist es, Eigenschaften von Objekten zu entfernen. Wenn eine zu löschende Eigenschaft den einzigen verbleibenden Verweis auf ein Objekt enthält, kann es natürlich sein, dass o entonces o wird anschließend auf die übliche Weise entsorgt.

Die Verwendung des delete Operator kann die Fähigkeit von JavaScript-Engines beeinträchtigen optimieren. Code .

20 Stimmen

Dies führt zu Problemen, wenn es auf eine Array-Objektinstanz angewendet wird, um ein vorhandenes Element zu entfernen, z. B. delete myArray[0] . Siehe stackoverflow.com/a/9973592/426379 y Löschen von Array-Elementen

5 Stimmen

Welche Probleme werden dadurch entstehen?

28 Stimmen

@Gottox - Die length Eigenschaft eines Array-Objekts bleibt unverändert.

91voto

Jason Bunting Punkte 56534

Alle Objekte in JavaScript sind als Hashtables/assoziative Arrays implementiert. Die folgenden sind also gleichwertig:

alert(myObj["SomeProperty"]);
alert(myObj.SomeProperty);

Und, wie bereits angedeutet, "entfernen" Sie eine Eigenschaft aus einem Objekt über die delete Schlüsselwort, das Sie auf zwei Arten verwenden können:

delete myObj["SomeProperty"];
delete myObj.SomeProperty;

Ich hoffe, die zusätzlichen Informationen helfen...

12 Stimmen

Es ist zu beachten, dass die Punktschreibweise nicht funktioniert, wenn die Eigenschaft kein einfacher Term ist, d. h. myObj['some;property'] funktioniert, aber myObj.some;property würde das nicht tun (aus offensichtlichen Gründen). Es ist vielleicht auch nicht offensichtlich, dass Sie eine Variable in der Klammerschreibweise verwenden können, d.h. var x = 'SomeProperty'; alert(myObj[x])

2 Stimmen

"Alle Objekte in JavaScript sind als Hashtables/assoziative Arrays implementiert. " - false. V8 bevorzugt es, ein Objekt als versteckte Klasse + dicht gepackte Felder zu speichern. Nur wenn Sie seltsame Dinge mit ihnen machen (wie das Entfernen von Feldern) gibt es auf und verwendet eine Hash-Map hinter den Kulissen.

6 Stimmen

@JanDvorak - hey, du weißt doch, wann diese Antwort ursprünglich geschrieben wurde, oder? Diese Beschreibung war und ist für die meisten Zwecke ausreichend. Abgesehen davon verstehe ich, dass ich mühsam pedantisch bin :)

43voto

Saul Punkte 17606

Keine der vorherigen Antworten geht auf die Tatsache ein, dass JavaScript keine assoziativen Arrays hat - es gibt keine array Typ als solchen, siehe typeof .

Was JavaScript hat, sind Objektinstanzen mit dynamischen Eigenschaften. Wenn Eigenschaften mit Elementen einer Array-Objektinstanz verwechselt werden, sind schlechte Dinge™ vorprogrammiert:

Problem

var elements = new Array()

elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]

console.log("number of elements: ", elements.length)   // Returns 2
delete elements[1]
console.log("number of elements: ", elements.length)   // Returns 2 (?!)

for (var i = 0; i < elements.length; i++)
{
   // Uh-oh... throws a TypeError when i == 1
   elements[i].onmouseover = function () { window.alert("Over It.")}
   console.log("success at index: ", i)
}

Lösung

Um eine universelle Entfernungsfunktion zu haben, die Sie nicht im Stich lässt, verwenden Sie:

Object.prototype.removeItem = function (key) {
   if (!this.hasOwnProperty(key))
      return
   if (isNaN(parseInt(key)) || !(this instanceof Array))
      delete this[key]
   else
      this.splice(key, 1)
};

//
// Code sample.
//
var elements = new Array()

elements.push(document.getElementsByTagName("head")[0])
elements.push(document.getElementsByTagName("title")[0])
elements["prop"] = document.getElementsByTagName("body")[0]

console.log(elements.length)                        // Returns 2
elements.removeItem("prop")
elements.removeItem(0)
console.log(elements.hasOwnProperty("prop"))        // Returns false as it should
console.log(elements.length)                        // returns 1 as it should

9 Stimmen

Diese Lösung hat zwei Probleme: es versteckt die Tatsache, dass Arrays und Objekte sind völlig unterschiedliche Tiere in JS (Sie wissen es, aber offenbar OP nicht) und es verwendet Prototypen. OP wäre besser dran, wenn er über Arrays und Objekte gelernt (und würde seine Variablen entsprechend benennen) - versuchen, die Unterschiede zwischen den beiden zu verstecken wird nur ihn in mehr Ärger bekommen. IMHO natürlich.

2 Stimmen

@johndodo - alle Array s in JS Objekte sind, versuchen Sie typeof new Array(); o typeof [] zu überprüfen. Array ist einfach eine bestimmte Art von Objekt und keineswegs ein "anderes Tier". In JS werden Objekte durch ihren Konstruktornamen und ihre Prototypenkette unterschieden, siehe Prototypische Programmierung .

11 Stimmen

Sie verstehen nicht, worum es geht. Ich weiß, dass Arrays auch Objekte sind, aber das bedeutet nicht, dass es klug ist, sie als solche zu verwenden. Der Programmierer sollte entscheiden, ob er etwas als Array (mit push, pop, [],...) oder als Objekt/"assoziatives Array" verwenden will. Mix and Match ist kein gutes Rezept, gerade wegen der Probleme, die Ihre Lösung zu verbergen versucht. Wenn Sie sich im Voraus entscheiden, welches Entwurfsmuster Sie verwenden wollen (Array oder Objekt), gibt es keine solchen Probleme.

40voto

Bipin Punkte 443

Dadurch wird nur das Objekt gelöscht, aber die Länge des Arrays bleibt gleich.

Um das Element aus dem Array zu entfernen, müssen Sie etwas wie folgt tun:

array.splice(index, 1);

12 Stimmen

In der Tat, aber in diesem Fall wird kein Array verwendet, sondern ein einfaches altes Objekt, daher hat es keine Längen- oder Splice-Methode.

2 Stimmen

@Andreaa Panagiotidis Außer wenn wir nicht über Arrays sprechen, dann ist es zu 100% falsch.

22voto

johndodo Punkte 15249

Die akzeptierte Antwort ist zwar richtig, aber es fehlt die Erklärung, warum es funktioniert.

Zuallererst sollte Ihr Code die Tatsache widerspiegeln, dass es sich um pas ein Array:

var myObject = new Object();
myObject["firstname"] = "Bob";
myObject["lastname"] = "Smith";
myObject["age"] = 25;

Beachten Sie, dass alle Objekte (einschließlich Array s) können auf diese Weise verwendet werden. Erwarten Sie jedoch nicht, dass die Standard-JavaScript-Array-Funktionen (pop, push, etc.) bei Objekten funktionieren!

Wie in der akzeptierten Antwort gesagt, können Sie dann delete um die Einträge aus den Objekten zu entfernen:

delete myObject["lastname"]

Sie sollten sich entscheiden, welchen Weg Sie einschlagen wollen - entweder verwenden Sie Objekte (assoziative Arrays / Dictionaries) oder Arrays (Maps). Mischen Sie niemals beides.

8 Stimmen

Sehr gute Antwort. Ich würde nur jedem raten, der dies liest, dass Arrays in Javascript nicht als "Maps" abstrahiert werden sollten, sondern als "Listen". Das liegt daran, dass man nicht versuchen sollte, die Kontrolle über den Index der Elemente zu haben, wenn man Arrays verwendet. Wenn Sie das versuchen... nun, lassen Sie es einfach :D

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