3

我正在尝试在 Codecademy 中学习 JavaScript,其中简要提到的一件事是“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,而不是数字和花色。我尝试在第一个和第二个循环之后放置 console.log() ,我注意到它在第一个循环中正常工作,但在第二个循环中没有。

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 回答