Wie kann ich alle Elemente in einem JavaScript-Objekt durchlaufen, einschließlich der Werte, die Objekte sind?
Wie könnte ich dies beispielsweise durchlaufen (Zugriff auf "your_name" und "your_message" für jede)?
var validation_messages = {
"key_1": {
"your_name": "jimmy",
"your_msg": "hello world"
},
"key_2": {
"your_name": "billy",
"your_msg": "foo equals bar"
}
}
javascript
Sommerzeit
quelle
quelle
Antworten:
quelle
for in
ist einem traditionellen sehr ähnlichforeach
.Unter ECMAScript 5 können Sie kombinieren
Object.keys()
undArray.prototype.forEach()
:quelle
for ... in ... hasOwnProperty
Muster kann auf alles aufgerufen werden, soweit ich das beurteilen kann (Objekt, Array, Null, undefiniert, wahr, falsch, Zahlenprimitiv, Objekte).Object.keys()
das, was es langsam macht, es ist eher dasforEach()
und der wiederholte Zugriff auf.length
! Wenn Siefor
stattdessen eine klassische Schleife verwenden, ist diese fast doppelt so schnell wiefor..in
+hasOwnProperty()
in Firefox 33.Das Problem damit
ist, dass Sie auch den Prototyp des primitiven Objekts durchlaufen.
Mit diesem vermeiden Sie es:
quelle
hasOwnProperty
Ihrefor
-in
Schleifen.In ES6 / 2015 können Sie ein Objekt wie folgt durchlaufen: (mithilfe der Pfeilfunktion )
jsbin
In ES7 / 2016 können Sie verwenden
Object.entries
stattObject.keys
und Schleife durch ein Objekt wie folgt aus :Das Obige würde auch als Einzeiler funktionieren :
jsbin
Wenn Sie auch verschachtelte Objekte durchlaufen möchten, können Sie eine rekursive Funktion (ES6) verwenden:
jsbin
Wie oben beschrieben, jedoch mit ES7
Object.entries()
anstelle vonObject.keys()
:Hier durchlaufen wir verschachtelte Objekte, ändern Werte und geben ein neues Objekt auf einmal zurück, indem wir es
Object.entries()
mitObject.fromEntries()
( ES10 / 2019 ) kombinieren :quelle
Verwenden von Underscore.js
_.each
:quelle
Wenn Sie die Rekursion verwenden, können Sie Objekteigenschaften beliebiger Tiefe zurückgeben.
quelle
I. Auf die Schlüssel muss zugegriffen werden.
✔ die
of
undObject.keys
Ansatz✔ der
in
AnsatzVerwenden Sie dieses mit Vorsicht, da es prototypische Eigenschaften von drucken könnte
obj
✔ der ES7-Ansatz
Zum Zeitpunkt der Bearbeitung würde ich die ES7-Methode jedoch nicht empfehlen, da JavaScript viele Variablen intern initialisiert, um diese Prozedur zu erstellen (Beweise finden Sie in den Rückmeldungen). Wenn Sie keine große App entwickeln, die eine Optimierung verdient, ist dies in Ordnung. Wenn jedoch die Optimierung Ihre Priorität ist, sollten Sie darüber nachdenken.
II. wir müssen nur auf jeden Wert zugreifen,
✔ die
of
undObject.values
AnsatzWeitere Rückmeldungen zu den Tests:
Object.keys
oderObject.values
Leistung ist vernachlässigbarZum Beispiel,
Für
Object.values
Fall einer native Verwendungfor
scheint Schleife mit zwischengespeicherten Variablen in Firefox ein wenig schneller zu sein als eine mitfor...of
Schleife. Allerdings ist der Unterschied nicht so wichtig , und Chrome läuftfor...of
schneller als nativerfor
Schleife, so dass ich zu Verwendung empfehlen würde ,for...of
wenn sie mit den UmgangObject.values
in allen Fällen (4. und 6. Tests).In Firefox ist die
for...in
Schleife sehr langsam. Wenn wir den Schlüssel während der Iteration zwischenspeichern möchten, ist es besser, ihn zu verwendenObject.keys
. Plus Chrome führt beide Strukturen mit gleicher Geschwindigkeit aus (1. und letzter Test).quelle
Ich weiß, dass es spät ist, aber ich habe 2 Minuten gebraucht, um diese optimierte und verbesserte Version von AgileJons Antwort zu schreiben:
quelle
hasOwnProperty
inowns
und rufen dann an,owns.call(obj, prop)
anstatt nur anzurufen,obj.hasOwnProperty(prop)
wie es diese Antwort tut?obj
diehasOwnProperty
Funktion möglicherweise selbst definiert ist, wird die Funktion von nicht verwendetObject.prototype
. Sie können es vor derfor
Schleife wieobj.hasOwnProperty = function(){return false;}
folgt versuchen und es wird keine Eigenschaft durchlaufen.quelle
p ist der Wert
ODER
quelle
In ES7 können Sie Folgendes tun:
quelle
quelle
Nur wenige Möglichkeiten, das zu tun ...
1) 2 Schichten für ... in Schleife ...
2) Verwenden
Object.key
3) Rekursive Funktion
Und nenne es wie:
quelle
Hier kommt die verbesserte und rekursive Version der AgileJon-Lösung ( Demo ):
Diese Lösung funktioniert für alle Arten von unterschiedlichen Tiefen.
quelle
Andere Option:
quelle
ECMAScript-2017, das erst vor einem Monat fertiggestellt wurde, führt Object.values () ein. Jetzt können Sie Folgendes tun:
quelle
Ich denke, es ist erwähnenswert, dass jQuery dies gut regelt
$.each()
.Siehe: https://api.jquery.com/each/
Zum Beispiel:
$(this)
ist das einzelne Element innerhalb des Objekts. Wechseln Sie$('.foo')
zu einer Variablen, wenn Sie die Selector-Engine von jQuery nicht verwenden möchten.quelle
Um das JavaScript-Objekt zu durchlaufen, können wir forEach verwenden und um den Code zu optimieren, können wir die Pfeilfunktion verwenden
quelle
Ich konnte die oben genannten Beiträge nicht dazu bringen, genau das zu tun, wonach ich gesucht hatte.
Nachdem ich mit den anderen Antworten hier herumgespielt hatte, machte ich das. Es ist hacky, aber es funktioniert!
Für dieses Objekt:
... dieser Code:
... erzeugt dies in der Konsole:
quelle
Die Lösung, die für mich funktioniert, ist die folgende
quelle
Exotisch - tiefe Traverse
In dieser Lösung verwenden wir einen Ersetzer , mit dem ganze Objekte und verschachtelte Objekte tief durchlaufen werden können. Auf jeder Ebene erhalten Sie alle Felder und Werte. Wenn Sie den vollständigen Pfad zu jedem Feld benötigen, klicken Sie hier
Code-Snippet anzeigen
quelle
In meinem Fall (auf der Grundlage des Vorstehenden) ist eine beliebige Anzahl von Ebenen möglich.
Ergebnis:
quelle