var obj = {
name: "Simon",
age: "20",
clothing: {
style: "simple",
hipster: false
}
}
for(var propt in obj){
console.log(propt + ': ' + obj[propt]);
}
Wie propt
repräsentiert die Variable die Eigenschaften des Objekts? Es ist keine eingebaute Methode oder Eigenschaft. Warum kommt es mit jeder Eigenschaft im Objekt?
javascript
loops
object
Rafay
quelle
quelle
if (typeof(obj[propt]) === 'object') {
/ * Mach es noch einmal * /}
Antworten:
Das Iterieren über Eigenschaften erfordert diese zusätzliche
hasOwnProperty
Prüfung:Dies ist erforderlich, da der Prototyp eines Objekts zusätzliche Eigenschaften für das Objekt enthält, die technisch Teil des Objekts sind. Diese zusätzlichen Eigenschaften werden von der Basisobjektklasse geerbt, sind jedoch weiterhin Eigenschaften von
obj
.hasOwnProperty
Überprüft einfach, ob dies eine für diese Klasse spezifische Eigenschaft ist und keine von der Basisklasse geerbte.Es ist auch möglich,
hasOwnProperty
das Objekt selbst aufzurufen :Dies schlägt jedoch fehl, wenn das Objekt ein nicht verwandtes Feld mit demselben Namen hat:
Deshalb ist es sicherer, es
Object.prototype
stattdessen durchzurufen:quelle
object.hasOwnProperty()
? Bedeutet die Tatsache, dassproperty
was auch immer Wert hat, nicht, dass es in istobject
?property
ist hier ein String, hätte aufgerufen werden sollenpropertyName
. Andernfalls kann es für JS-Neulinge wie mich zu Verwirrung kommen, dh was im Inneren zu tun istif
.Ab JavaScript 1.8.5 können Sie
Object.keys(obj)
ein Array von Eigenschaften abrufen, die für das Objekt selbst definiert sind (diejenigen, für die true zurückgegeben wirdobj.hasOwnProperty(key)
).Dies ist besser (und besser lesbar) als die Verwendung einer For-In-Schleife.
Es wird in diesen Browsern unterstützt:
Siehe das Mozilla Developer Network Object.keys () ‚s Referenz für weitere Informationen.
quelle
Object.keys(myObject).forEach(function(key,index) { //key = the name of the object key //index = the ordinal position of the key within the object });
for candidate in candidateStatus
... scheint mir lesbarMädchen und Jungs, wir sind im Jahr 2019 und wir haben nicht so viel Zeit zum Tippen ... Also lasst uns dieses coole neue schicke ECMAScript 2016 machen:
quelle
obj=window.performance.memory
: - / Wo wiefor in
. dhvar obj = window.performance.memory; for( key in obj ) console.log( 'key=' + key + ' val=' + obj[key] );
window.performance.memory
wird nur von Chrome unterstützt undObject.keys(obj)
gibt ein leeres Array zurück. Das hat nichts damit zu tun.map
.e
daran interessiert sein möchte, diesen Einzeiler neu zu strukturieren, um mehr als eine Sache gleichzeitig zu erledigen , habe ich diesen Kern veröffentlicht. Es ist im Grunde genau wie die meisten Hash-Implementierungen und verwendet(
(key)
=>
(value)
)
stattdessen{
key
=>
value
}
, aber wenn Sie sich vorher nicht damit befassen mussten, könnte es Ihnen helfen, es besser zu visualisieren: gist.github.com/the-nose-knows/9f06e745a56ff20519707433e28a4fa8Es ist die
for...in statement
( MDN , ECMAScript-Spezifikation ).Sie können es als lesen „ für jede Eigenschaft in dem
obj
Objekt, jede Eigenschaft zum zuweisen PROPT Variable wiederum“.quelle
in
Operator und diefor
Anweisung sind überhaupt nicht beteiligt, diefor-in
Anweisung stellt eine Grammatikproduktion für sich dar :for ( LeftHandSideExpression in Expression )
,for ( var VariableDeclarationNoIn in Expression )
In aktuellen Implementierungen von ES können Sie Folgendes verwenden
Object.entries
:oder
Wenn Sie nur die Werte durchlaufen möchten, verwenden Sie Object.values:
oder
quelle
Es ist nur eine
for...in
Schleife. Lesen Sie die Dokumentation bei Mozilla .quelle
Wenn Ihre Umgebung ES2017 unterstützt, würde ich Object.entries empfehlen :
Wie in der Dokumentation zu Mozillas Object.entries () gezeigt :
Grundsätzlich können wir mit Object.entries auf den folgenden zusätzlichen Schritt verzichten, der mit dem älteren for ... in loop erforderlich ist :
quelle
Mit jquery können Sie dies jetzt tun:
quelle
$.each({foo:1, length:0, bar:2}, function(k,v){console.log(k,v)})
$ .each ist nicht für Objekte geeignet . Wenn ein Objekt zufällig eine Längeneigenschaft hat und sein Wert Null ist, wird das gesamte Objekt so behandelt, als wäre es ein leeres Array.Dominiks Antwort ist perfekt, ich mache es einfach lieber so, da es sauberer zu lesen ist:
quelle
Object
mit Großbuchstaben o sein, nein?Die obigen Antworten sind etwas ärgerlich, da sie nicht erklären, was Sie in der for-Schleife tun, nachdem Sie sichergestellt haben, dass es sich um ein Objekt handelt: SIE ZUGREIFEN NICHT DIREKT! Sie erhalten tatsächlich nur den SCHLÜSSEL, den Sie für das OBJ benötigen:
Dies ist alles ECMA5 sicher. Funktioniert sogar in lahmen JS-Versionen wie Rhino;)
quelle
Hinzufügen der Verwendung
Reflect.ownKeys(obj)
und Iteration von ES2015 über die Eigenschaften über einen Iterator.Zum Beispiel:
kann durch iteriert werden
Wenn Sie direkt über die Werte der Schlüssel eines Objekts iterieren möchten, können Sie einen definieren
iterator
, genau wie die Standarditeratoren von JavaScipts für Zeichenfolgen, Arrays, typisierte Arrays, Map und Set.JS versucht, über die Standard-Iterator-Eigenschaft zu iterieren, die als definiert werden muss
Symbol.iterator
.Wenn Sie in der Lage sein möchten, alle Objekte zu durchlaufen, können Sie es als Prototyp von Object hinzufügen:
Auf diese Weise können Sie die Werte eines Objekts mit einer for ... of-Schleife durchlaufen, z. B.:
Achtung : Zum Zeitpunkt des Schreibens dieser Antwort (Juni 2018) unterstützen alle anderen Browser außer IE Generatoren und
for...of
Iterationen überSymbol.iterator
quelle
quelle
forEach
leere Werte übersprungen werden , könnten Sie das Wenn undObject.keys(obj).forEach(e => console.log(`key=${e} value=${obj[e]}`));
die Antwort von Frank Roth einfach loswerden .Die for ... in-Schleife repräsentiert jede Eigenschaft in einem Objekt, da sie genau wie eine for-Schleife ist. Sie haben propt in der for ... in-Schleife definiert, indem Sie Folgendes getan haben:
Eine for ... in-Schleife durchläuft die aufzählbaren Eigenschaften eines Objekts. Die Variable, die Sie definieren oder in die for ... in-Schleife einfügen, ändert sich jedes Mal, wenn Sie zur nächsten iterierten Eigenschaft wechseln. Die Variable in der for ... in-Schleife durchläuft die Schlüssel, aber der Wert ist der Wert des Schlüssels. Zum Beispiel:
Sie können sehen, wie sich die Variable vom Wert der Variablen unterscheidet. Im Gegensatz dazu macht eine for ... of-Schleife das Gegenteil.
Ich hoffe das hilft.
quelle
quelle
forEach
ist dies hier besser geeignet, damap
ein neues Array mit den Ergebnissen des Aufrufs des Codeblocks bei jeder Iteration zurückgegeben werden soll. Wir interessieren uns jedoch nur für die Nebeneffekte jeder Iteration, nicht für den Rückgabewert. Daher benötigen wir nicht das neue Array,map
das uns zur Verfügung steht.quelle
Sie können Lodash verwenden. Die Dokumentation
quelle
Ihre
for
Schleife durchläuft alle Eigenschaften des Objektsobj
.propt
wird in der ersten Zeile Ihrer for-Schleife definiert. Es ist eine Zeichenfolge, die den Namen einer Eigenschaft desobj
Objekts darstellt. In der ersten Iteration der Schleifepropt
wäre "Name".quelle
Objekte in JavaScript sind Sammlungen von Eigenschaften und können daher für jede Anweisung in einer Schleife ausgeführt werden.
Sie sollten sich
obj
eine Schlüsselwertsammlung vorstellen.quelle
Heutzutage können Sie ein Standard-JS-Objekt in ein iterierbares Objekt konvertieren, indem Sie einfach eine Symbol.iterator-Methode hinzufügen. Dann können Sie eine
for of
Schleife verwenden und direkt auf ihre Werte zugreifen oder sogar einen Spread-Operator für das Objekt verwenden. Cool. Mal sehen, wie wir es schaffen können:quelle
function*
Entdeckung!Wenn Sie Node ausführen, würde ich empfehlen:
quelle
Während die am besten bewertete Antwort korrekt ist, gibt es hier einen alternativen Anwendungsfall, dh wenn Sie über ein Objekt iterieren und am Ende ein Array erstellen möchten. Verwenden Sie
.map
anstelle vonforEach
quelle
Hinzufügen des rekursiven Weges:
Verwendungszweck:
quelle
Was for..in loop tut, ist, dass es eine neue Variable (var someVariable) erstellt und dann jede Eigenschaft des angegebenen Objekts einzeln in dieser neuen Variablen (someVariable) speichert. Wenn Sie also Block {} verwenden, können Sie iterieren. Betrachten Sie das folgende Beispiel.
quelle
obj[someVariable]
. Vielleicht liegt der Grund dafür, dass es so stark herabgestuft wurde, darin, dass es nicht rekursiv ist. Dies wäre also keine adäquate Lösung, wenn Sie ein stark strukturiertes Objekt haben.Hier iteriere ich jeden Knoten und erstelle aussagekräftige Knotennamen. Wenn Sie bemerken, machen instanceOf Array und instanceOf Object so ziemlich dasselbe (in meiner Anwendung gebe ich jedoch eine andere Logik an).
Anmerkung - Ich bin von Ondrej Svejdars Antwort inspiriert. Diese Lösung hat jedoch eine bessere Leistung und ist weniger mehrdeutig
quelle
Grundsätzlich möchten Sie jede Eigenschaft im Objekt durchlaufen.
JSFiddle
quelle
obj(prop)
<- TypeError: obj ist keine FunktionhasOwnProperty
Attribut versehentlich herausgenommen haben. Es sollte jetzt funktionieren.Ich möchte die obigen Antworten ergänzen, da Sie möglicherweise andere Absichten als Javascript haben. Ein JSON-Objekt und ein Javascript-Objekt sind verschiedene Dinge, und Sie möchten möglicherweise die Eigenschaften eines JSON-Objekts mit den oben vorgeschlagenen Lösungen durchlaufen und sich dann überraschen lassen.
Angenommen, Sie haben ein JSON-Objekt wie:
Der falsche Weg, um seine 'Eigenschaften' zu durchlaufen:
Sie könnten sehen die Konsolenprotokollierung überrascht sein
0
,1
usw. , wenn das Iterieren durch die Eigenschaftenprop1
undprop2
undprop3_1
. Diese Objekte sind Sequenzen, und die Indizes einer Sequenz sind Eigenschaften dieses Objekts in Javascript.Eine bessere Möglichkeit, die Eigenschaften eines JSON-Objekts rekursiv zu durchlaufen, besteht darin, zunächst zu überprüfen, ob es sich bei diesem Objekt um eine Sequenz handelt oder nicht:
quelle
Zur weiteren Verfeinerung der akzeptierte Antwort es ist erwähnenswert, dass , wenn Sie das Objekt mit einem instanziiert
var object = Object.create(null)
dannobject.hasOwnProperty(property)
wird eine Typeerror auslösen. Um auf der sicheren Seite zu sein, müssen Sie es vom Prototyp wie folgt aufrufen:quelle
Überprüfen Sie diesen Link, um https://www.w3schools.com/jsref/tryit.asp?filename=tryjsref_state_forin zu helfen
quelle