3

私は Codecademy で JavaScript を学ぼうとしていますが、簡単に言及されたものの 1 つは "for in" ループです。いくつかの演習でそれらを使用しましたが、この場合は機能しません。for (i = blah; etc) でそれを行うことができますが、これの何が問題なのか、それを修正する方法があるかどうかを知りたいです:

//Your three dimensional array from the last exercise probably
//looked something like this:
var hands = [];
hands[0] = [ [3,"H"], ["A","S"], [1,"D"], ["J","H"], ["Q","D"] ];
hands[1] = [ [9,"C"], [6,"C"], ["K","H"], [3,"C"], ["K","H"] ];

//Loop over every dimension in the array, logging out the suit and rank
//of each card in both hands
//1. loop over each hand
for (var hand in hands) {
//2. loop over each card array in each hand
    for (var card in hand) {
        //3. loop over each rank/suit array for each card in each hand
        for (var prop in card) {
            //4. log the value of the rank/suit array item
            console.log(card[prop]);
        }
    }
}

出力は、数字とスーツではなく、0 0 0 です。最初と 2 番目のループの後に console.log() を配置しようとしましたが、最初のループでは正しく動作するが、2 番目のループでは正しく動作しないことに気付きました。

4

2 に答える 2

11

問題を一時的に無視するfor-inと、内側のループは次のようになります...

for (var hand in hands) {
    for (var card in hands[hand]) {
        for (var prop in hands[hand][card]) {
            console.log(hands[hand][card][prop]);
        }
    }
}

各内側ループは、外側ループの現在の値を明示的に参照する必要があることに注意してください。代わりに、キー ( の前の変数in) を反復処理しています。


配列を適切に扱うには、ほとんどの場合、for代わりにループを使用する必要がありfor-inます。

for (var i = 0; i < hands.length; i++) {
    for (var j = 0; j < hands[i].length; j++) {
        for (var k = 0; k < hands[i][j].length; k++) {
            console.log(hands[i][j][k]);
        }
    }
}

これにはいくつかの理由があり、StackOverflow で見つけることができます。


コードを明確にするために、現在のアイテムを変数にキャッシュできます...

for (var i = 0; i < hands.length; i++) {
    var hand = hands[i]
    for (var j = 0; j < hand.length; j++) {
        var cards = hand[j];
        for (var k = 0; k < cards.length; k++) {
            console.log(cards[k]);
        }
    }
}
于 2012-08-04T13:12:10.677 に答える
2

for..in配列のインデックス付きメンバーだけでなく、オブジェクトのすべてのプロパティをループするため、配列でループを使用しないでください。for代わりに、「従来の」ループ、または ECMAScript 5を使用できます。.forEach

var hand, card, prop, h, c, p;

for (h = 0; h < hands.length; ++h) {
    hand = hands[h];
    for (c = 0; c < hand.length; ++c) {
        card = hand[c];
        for (p = 0; p < card.length; ++p) {
            prop = card[p];
            console.log(prop);
        }
    }
}

上記を行うためのより短い方法がありますが、それは基本的で読みやすい方法です。

于 2012-08-04T13:14:01.753 に答える