Vorsicht:
Die Frage gilt weiterhin für
for…of
Schleifen.> Nichtfor…in
zum Durchlaufen eines Arrays verwenden, sondern zum Durchlaufen der Eigenschaften eines Objekts. Das heißt, das
Ich verstehe, dass die grundlegende for…in
Syntax in JavaScript folgendermaßen aussieht:
for (var obj in myArray) {
// ...
}
Aber wie bekomme ich den Schleifenzähler / Index ?
Ich weiß, ich könnte wahrscheinlich so etwas tun:
var i = 0;
for (var obj in myArray) {
alert(i)
i++
}
Oder sogar die guten Alten:
for (var i = 0; i < myArray.length; i++) {
var obj = myArray[i]
alert(i)
}
Aber ich würde lieber die einfachere for-in
Schleife verwenden. Ich denke, sie sehen besser aus und machen mehr Sinn.
Gibt es einen einfacheren oder eleganteren Weg?
In Python ist es einfach:
for i, obj in enumerate(myArray):
print i
javascript
for-loop
foreach
counter
hobbes3
quelle
quelle
alert(obj)
?Antworten:
for…in
iteriert über Eigenschaftsnamen, nicht über Werte, und zwar in einer nicht angegebenen Reihenfolge (ja, auch nach ES6). Sie sollten es nicht verwenden, um über Arrays zu iterieren. Für sie gibt es die ES5-forEach
Methode, die sowohl den Wert als auch den Index an die von Ihnen angegebene Funktion übergibt:Oder ES6s
Array.prototype.entries
, die jetzt in allen aktuellen Browserversionen unterstützt werden:Für Iterables im Allgemeinen (bei denen Sie
for…of
eher eine Schleife als eine verwenden würdenfor…in
) ist jedoch nichts integriert:Demo
Wenn Sie tatsächlich gemeint hätten
for…in
- Eigenschaften aufzählen -, würden Sie einen zusätzlichen Zähler benötigen.Object.keys(obj).forEach
könnte funktionieren, enthält aber nur eigene Eigenschaften;for…in
Enthält unzählige Eigenschaften in der gesamten Prototypenkette.quelle
let
s sindvar
s mit Blockbereich.const
s sind unveränderlich.%d
eine Ganzzahl und%s
eine Zeichenfolge. Sie basieren auf printf . Unter console.spec.whatwg.org/#formatter wird eine Spezifikation ausgeführt .In ES6 ist es gut, die for-of-Schleife zu verwenden. Sie können Index für so etwas bekommen
Beachten Sie, dass
Array.entries()
gibt einen Iterator , das ist , was es in der for-Schleife von arbeiten können; Verwechseln Sie dies nicht mit Object.entries () , das ein Array von Schlüssel-Wert-Paaren zurückgibt .quelle
entries()
gibt ein leeres Objekt zurück :{}
. Irgendeine Idee warum das so wäre? Meinarray
ist ein Array von Objekten.Object.entries(array)
stattarray.entries()
next()
Methode, die bei jedem Aufruf nachfolgende Einträge im Array zurückgibt. Es sind keine (sichtbaren) Daten darin; Sie erhalten die Daten im zugrunde liegenden Objekt durch Aufrufennext()
, was for-of hinter den Kulissen tut. cc @tonygWie wäre es damit
Wobei
array.forEach
diese Methode einenindex
Parameter hat, der der Index des aktuellen Elements ist, das im Array verarbeitet wird.quelle
break
es nicht verfügbar ist.Lösung für kleine Array-Sammlungen:
arr - ARRAY, obj - KEY des aktuellen Elements, i - COUNTER / INDEX
Hinweis: Method keys () ist für IE-Version <9 nicht verfügbar. Sie sollten Polyfill- Code verwenden. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
quelle
var i = 0;
undi++;
kürzer und effizienter zu gestalten . Außerdem funktioniert es nicht für aufzählbare Eigenschaften, die keine eigenen Eigenschaften sind.For-in-Loops durchlaufen die Eigenschaften eines Objekts. Verwenden Sie sie nicht für Arrays, auch wenn sie manchmal funktionieren.
Objekteigenschaften haben dann keinen Index, sie sind alle gleich und müssen nicht in einer bestimmten Reihenfolge durchlaufen werden. Wenn Sie Eigenschaften zählen möchten, müssen Sie den zusätzlichen Zähler einrichten (wie in Ihrem ersten Beispiel).
Schleife über ein Array:
Schleife über ein Objekt:
quelle
(var i=0; i<a.length; i++)
verschwendete Ressourcen sind. Verwenden Sie(var i=0, var len = a.length; i<len; i++)
var i=0; i<a.length; i++)
das Standardschleifenmuster, das ohnehin von jeder anständigen Javascript-Engine optimiert wird.var i=0; i<a.length; i++
ist die beste Vorgehensweise.Wie andere gesagt haben, sollten Sie for..in nicht verwenden, um über ein Array zu iterieren.
Wenn Sie eine sauberere Syntax wünschen, können Sie forEach verwenden:
Wenn Sie diese Methode verwenden möchten, stellen Sie sicher, dass Sie das ES5-Shim einschließen, um Unterstützung für ältere Browser hinzuzufügen.
quelle
Antwort von RushUp Ist richtig, aber dies ist bequemer
quelle
Hier ist eine Funktion
eachWithIndex
, die mit allem iterierbaren funktioniert .Sie können auch eine ähnliche Funktion schreiben
eachWithKey
, die mit objets funktioniertfor...in
.Das Gute an Generatoren ist, dass sie faul sind und das Ergebnis eines anderen Generators als Argument heranziehen können.
quelle
Das ist meine Version eines zusammengesetzten Iterators, der einen Index und den Wert einer übergebenen Generatorfunktion mit einem Beispiel für eine (langsame) Primzahlsuche liefert:
quelle
eachWithIndex[Symbol.iterator]
statt nur eine FunktioneachWithIndex
?eachWithIndex
erfüllt nicht die iterierbare Schnittstelle, die der springende Punkt istSymbol.iterator
.eachWithIndex
, um iterable zu akzeptieren und eine geschlossene zusammengesetzte iterable zurückzugeben.Zusätzlich zu den sehr guten Antworten, die alle gepostet haben, möchte ich hinzufügen, dass die leistungsstärkste Lösung die ES6 ist
entries
. Es scheint für viele Entwickler hier kontraintuitiv zu sein, also habe ich diesen perfekten Benchamrk erstellt .Es ist ~ 6 mal schneller. Hauptsächlich, weil nicht: a) mehr als einmal auf das Array zugegriffen werden muss und b) der Index umgewandelt werden muss.
quelle