嵌套于..在JavaScript语句中

Nested for...in statements in JavaScript

本文关键字:语句 JavaScript 嵌套      更新时间:2023-09-26

我正在尝试在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()放在第一个和第二个循环之后,我注意到它在第一个循环中工作正常,但在第二个中没有。

暂时忽略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]);
        }
    }
}

不应该在数组上使用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);
        }
    }
}

有一些较短的方法可以完成上述操作,但这是一种基本且可读的方法。