488

注意:

for…of問題はまだループに適用されます。> Arrayfor…inを反復処理するために使用しないでください。オブジェクトのプロパティを反復処理するために使用してください。とは言え、これは


for…inJavaScriptの基本的な構文は次のようになっていることを理解しています。

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

しかし、どうすればループカウンター/インデックスを取得できますか?

私はおそらく次のようなことができることを知っています:

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

または古き良きものでさえ:

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

しかし、私はより単純なfor-inループを使用したいと思います。見栄えが良く、より理にかなっていると思います。

よりシンプルまたはよりエレガントな方法はありますか?


Python では簡単です。

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

13 に答える 13

824

for…in値ではなくプロパティ名を反復し、不特定の順序で反復します(はい、ES6 以降でも)。配列を反復処理するために使用しないでください。forEachそれらのために、値とインデックスの両方を指定した関数に渡すES5 のメソッドがあります。

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

Array.prototype.entriesまたは、現在のブラウザ バージョン全体でサポートされるようになったES6 の:

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

一般的なイテラブル (for…ofではなくループを使用する場合for…in) には、何も組み込まれていませんが、次のようになります。

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);
}

デモ

実際にfor…inプロパティを列挙することを意味する場合は、追加のカウンターが必要になります。機能しますが、独自のプロパティObject.keys(obj).forEachのみが含まれます。プロトタイプ チェーンの任意の場所に列挙可能なプロパティが含まれます。for…in

于 2012-04-16T18:49:16.917 に答える
23

小さな配列コレクションのソリューション:

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

arr - ARRAY、 obj - 現在の要素のキー、 i - COUNTER/INDEX

注意:メソッドkeys()はバージョン 9 未満の IE では使用できません。Polyfillコードを使用する必要があります。 https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/keys

于 2015-01-12T09:36:00.010 に答える
15

for-in-loop は、オブジェクトのプロパティを反復処理します。それらが機能する場合でも、配列には使用しないでください。

オブジェクト プロパティにはインデックスがありません。それらはすべて等しく、決められた順序で実行する必要はありません。プロパティをカウントする場合は、追加のカウンターを設定する必要があります (最初の例で行ったように)。

配列をループします:

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

オブジェクトのループ:

var o = {};
for (var prop in o) {
    prop // is the property name
    o[prop] // is the property value - the item
}
于 2012-04-16T18:49:22.730 に答える
11

他の人が言ったように、 for..in を使用して配列を反復処理するべきではありません。

for ( var i = 0, len = myArray.length; i < len; i++ ) { ... }

よりクリーンな構文が必要な場合は、forEach を使用できます。

myArray.forEach( function ( val, i ) { ... } );

この方法を使用する場合は、必ず ES5 shim を含めて、古いブラウザーのサポートを追加してください。

于 2012-04-16T18:55:37.170 に答える
0

この場合、単純な列挙関数を使用して満足のいく答えを取得します。

var = [100, 254, 3, 55]
for a in enumerate(var):
print(a)

出力:

(0, 100)
(1, 254)
(2, 3)
(3, 55)
于 2022-03-05T11:21:12.370 に答える