So entfernen Sie Schlüssel + Wert aus dem Hash in Javascript

78

Gegeben

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myHash['key2'] = { Name: 'Object 2' };
myHash['key3'] = { Name: 'Object 3' };

Wie entferne ich key2und object 2aus dem Hash, so dass es in einem Zustand endet, als ob ich es getan hätte:

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myHash['key3'] = { Name: 'Object 3' };

Löschen macht nicht was ich will;

delete myHash['key2'] 

gibt mir einfach folgendes:

var myHash = new Array();
myHash['key1'] = { Name: 'Object 1' };
myhash['key2'] = null;
myHash['key3'] = { Name: 'Object 3' };

Die einzigen Dokumente, die ich finden spliceund slicemit ganzzahligen Indexern umgehen kann, die ich nicht habe.

Edit: Ich weiß auch nicht, dass 'key2' unbedingt in Position ist [1]

AKTUALISIEREN

OK, leicht roter Hering, Löschen scheint an der Oberfläche das zu tun, was ich will. Ich verwende jedoch json2.js, um mein Objekt mit json zu verbinden, damit es zurück zum Server verschoben werden kann.

Nach dem Löschen wird myHash wie folgt serialisiert:

[ { Name: 'Object 1' }, null, { Name: 'Object 3' } ]

Ist das ein Fehler in json2.js? oder mache ich etwas falsch mit löschen?

Vielen Dank

Andrew Bullock
quelle
3
Sie fügen einem Objekt Eigenschaften hinzu, die sich vom Hinzufügen von Elementen zu einem Array / Hash unterscheiden. Sie suchen nach einer Möglichkeit, eine Eigenschaft mehr oder weniger zu entfernen. Versuchen Sie, myHash.key1 zu löschen, wie in anderen Kommentaren erwähnt.
David Andres
2
Wenn es sich um eine Hashtabelle handelt, sollten Sie var myHash = new Object()anstelle von verwenden var myHash = new Array().
cprcrack

Antworten:

182

Sie suchen delete:

delete myhash['key2']

Weitere Informationen finden Sie im Core Javascript Guide

karim79
quelle
1
Ich dachte, das wäre richtig, deshalb habe ich es zuerst versucht. Es scheint zu funktionieren, mein Problem liegt tatsächlich in Json.stringify, ich werde die Frage aktualisieren
Andrew Bullock
8
Verwenden Sie stattdessen die Spleißfunktion. Löschen hinterlässt ein Loch im Array.
David Andres
2
Hier ist übrigens die oben erwähnte Spleißfunktion.
Per Lundberg
Dies ist nicht die beste Option, wenn die Änderungen an myhashnur im aktuellen Bereich erfolgen sollen. deletekann Nebenwirkungen haben, wenn sich Variablen an anderer Stelle auf das myhashObjekt beziehen .
Max Pleaner
Machte meinen Tag @ karim79 tysm
11

Warum verwenden Sie new Array();für Hash? Sie müssen new Object()stattdessen verwenden.

Und ich denke, Sie werden bekommen, was Sie wollen.

Eldar Djafarov
quelle
4
Ich mag überhaupt nichts Neues. Ich bevorzuge var myHash = [];
Nosredna
10
Oder in diesem Fall myHash = {}; :-)
Nosredna
Genau. Das einzige, was ein Array Ihnen gibt, ist eine Länge, die niemals funktioniert, wenn Sie den Indexer anders als ein int ändern.
Ihr Freund Ken
6

Sie sagen, Sie wissen nicht unbedingt, dass 'key2' in Position ist [1]. Nun, das ist es nicht. Position 1 würde von myHash [1] belegt.

Sie missbrauchen JavaScript-Arrays, die (wie Funktionen) Schlüssel- / Wert-Hashes zulassen. Obwohl JavaScript dies zulässt, bietet es Ihnen keine Möglichkeit, damit umzugehen, wie es eine Sprache für assoziative Arrays tun würde. Die Array-Methoden von JavaScript funktionieren nur mit den nummerierten Eigenschaften.

Das erste, was Sie tun sollten, ist zu Objekten anstatt zu Arrays zu wechseln. Sie haben keinen guten Grund, hier ein Array anstelle eines Objekts zu verwenden. Tun Sie es also nicht. Wenn Sie ein Array verwenden möchten, nummerieren Sie einfach die Elemente und geben Sie die Idee von Hashes auf. Die Absicht eines Arrays besteht darin, Informationen zu speichern, die numerisch indiziert werden können.

Sie können natürlich einen Hash (Objekt) in ein Array einfügen, wenn Sie möchten.

myhash[1]={"key1","brightOrangeMonkey"};
Nosredna
quelle
1

Eine andere Option kann diese Methode zum Entfernen von John Resig sein . kann besser passen, was Sie brauchen. wenn Sie den Index im Array kennen.

andres descalzo
quelle
2
Nun, den Index nicht zu haben, ist genau das, was in der Frage steht
Andrew Bullock
Hey @AndrewBullock Ich habe eine Abfrage, bei der ich ein JSON-Array erhalte. Beispiel: [{\ "Countrycode \": \ "DE \", \ "count \": \ "3 \"}], aber ich möchte wie [{"DE ":" 3 "}] gefällt mir, aber ich bekomme diese Ausgabe nicht. Bitte helfen Sie mir