615 Stimmen

Schleifenzähler/Index mit for of-Syntax in JavaScript abrufen

Vorsicht!

Frage gilt weiterhin für for…of Schleifen.> Nicht verwenden for…in zur Iteration über eine Array verwenden, um zu iterieren über die Eigenschaften eines Objekts. Das heißt, dies


Ich verstehe, dass die grundlegenden for…in Syntax in JavaScript sieht wie folgt aus:

for (var obj in myArray) {
    // ...
}

Aber wie bekomme ich die Schleife Zähler/Index ?

Ich weiß, dass ich wahrscheinlich etwas Ähnliches tun könnte:

var i = 0;
for (var obj in myArray) {
    alert(i)
    i++
}

Oder sogar die gute alte:

for (var i = 0; i < myArray.length; i++) {
    var obj = myArray[i]
    alert(i)
}

Aber ich würde lieber die einfachere for-in Schleife. Ich finde, sie sehen besser aus und machen mehr Sinn.

Gibt es einen einfacheren oder eleganteren Weg?


In Python ist das ganz einfach:

for i, obj in enumerate(myArray):
    print i

993voto

Ry- Punkte 208020

for…in iteriert über Eigenschaftsnamen, nicht über Werte, und tut dies in unbestimmter Reihenfolge (ja, auch nach ES6). Sie sollten es nicht verwenden, um über Arrays zu iterieren. Für sie gibt es ES5's forEach Methode, die sowohl den Wert als auch den Index an die Funktion übergibt, die Sie ihr geben:

var myArray = [123, 15, 187, 32];

myArray.forEach(function (value, i) {
    console.log('%d: %s', i, value);
});

// Outputs:
// 0: 123
// 1: 15
// 2: 187
// 3: 32

Oder ES6's Array.prototype.entries die jetzt von allen aktuellen Browser-Versionen unterstützt wird:

for (const [i, value] of myArray.entries()) {
    console.log('%d: %s', i, value);
}

Für Iterables im Allgemeinen (wo Sie eine for…of Schleife anstelle einer for…in ), es ist jedoch nichts eingebaut:

function* enumerate(iterable) {
    let i = 0;

    for (const x of iterable) {
        yield [i, x];
        i++;
    }
}

for (const [i, obj] of enumerate(myArray)) {
    console.log(i, obj);
}

Démo%20%7B%0A%20%20%20%20console.log(i%2C%20obj)%3B%0A%7D)

Wenn Sie tatsächlich meinen for…in - Eigenschaften aufzählen - Sie würden einen zusätzlichen Zähler benötigen. Object.keys(obj).forEach könnte funktionieren, aber es umfasst nur eigene Eigenschaften; for…in enthält aufzählbare Eigenschaften an beliebiger Stelle in der Prototypenkette.

421voto

rushUp Punkte 3461

In ES6 ist es gut, eine for... of Schleife. Sie können den Index in for... of wie diese

for (let [index, val] of array.entries()) {
  // your code goes here    
}

Beachten Sie, dass Array.entries() gibt zurück. ein Iterator was es ermöglicht, in der for-of-Schleife zu arbeiten; verwechseln Sie dies nicht mit Object.entries() die ein Array von Schlüssel-Wert-Paaren.

53voto

Sanjay Shr Punkte 1816

Wie wäre es damit

let numbers = [1,2,3,4,5]
numbers.forEach((number, index) => console.log(`${index}:${number}`))

Wo array.forEach diese Methode hat eine index der den Index des aktuell bearbeiteten Elements im Array angibt.

21voto

Lösung für kleine Array-Sammlungen:

for (var obj in arr) {
    var i = Object.keys(arr).indexOf(obj);
}

arr - ARRAY, obj - KEY des aktuellen Elements, i - ZÄHLER/INDEX

Hinweis: Methode Schlüssel() ist für IE-Version <9 nicht verfügbar, Sie sollten Polyfill Code. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

15voto

Bergi Punkte 565633

For-in-Schleifen iterieren über 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 wollen, müssen Sie einen zusätzlichen Zähler einrichten (wie in Ihrem ersten Beispiel).

Schleife über ein Array:

var a = [];
for (var i=0; i<a.length; i++) {
    i // is the index
    a[i] // is the item
}

Schleife über ein Objekt:

var o = {};
for (var prop in o) {
    prop // is the property name
    o[prop] // is the property value - the item
}

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