Javascript: смущен тем, как работают вложенные циклы - PullRequest
5 голосов
/ 04 июня 2011

Почему вложенные for loops работают так же, как в следующем примере:

var times = [
            ["04/11/10", "86kg"], 
            ["05/12/11", "90kg"],
            ["06/12/11", "89kg"]
];

for (var i = 0; i < times.length; i++) {
        var newTimes = [];
        for(var x = 0; x < times[i].length; x++) {
            newTimes.push(times[i][x]);
            console.log(newTimes);  


        }

    }

В этом примере я бы подумал, что console.log выдаст мне следующий вывод:

["04/11/10"]
["86kg"]
["05/12/11"]
["90kg"]
["06/12/11"]
["89kg"]

Тем не менее, я действительно получаю это:

["04/11/10"]
["04/11/10", "86kg"]
["05/12/11"]
["05/12/11", "90kg"]
["06/12/11"]
["06/12/11", "89kg"]

Кто-нибудь может помочь мне понять это?

EDIT:

Спасибо за все ваши ответы!

Ответы [ 5 ]

9 голосов
/ 04 июня 2011

Вы переопределяете newTimes в каждом цикле и выводите на консоль при каждом нажатии столбца.

var times = [
            ["04/11/10", "86kg"], 
            ["05/12/11", "90kg"],
            ["06/12/11", "89kg"]
];
 var newTimes = [];
for (var i = 0; i < times.length; i++) {     
        for(var x = 0; x < times[i].length; x++) {
            newTimes.push(times[i][x]);
        }
    }
    console.log(newTimes);  

Возвращает: ["04/11/10", "86kg", "05/12/11", "90kg", "06/12/11", "89kg"] http://jsfiddle.net/niklasvh/SuEdt/

3 голосов
/ 28 июня 2014
// remember that the increment of the counter variable
// is always executed after each run of a loop


for (var i = 0; i < n; i++) {
    // some statement(s) to do something.. 

        // initializes child-loop counter in the first run of the parent-loop
        // resets child-loop counter in all following runs of the parent-loop
        // while i is greater than 0 and lower than n

    for (var j = 0; j < p; j++) {
        // some statement(s) to do something..

            // initializes grandchild-loop counter in the first run of the child-loop
            // resets grandchild-loop counter in all following runs of the child-loop
            // while j is greater than 0 and lower than p

        for (var k = 0; k < q; k++) {
            // some statement(s) to do something..
            // or add more internal loop-nestings if you like..
        }
    }
}

// if the counter variables of the descendent-loops were set before the loop-nesting,
// the inner loops would only run once, because the counter would keep the value
// of the abortion condition after the loop is finished
1 голос
/ 04 июня 2011

Проблема во втором раунде внутреннего цикла, где он помещает второй элемент в newTimes.Во всяком случае, я не понимаю причину внутреннего цикла.Вы можете написать гораздо проще:

var times = [
            ["04/11/10", "86kg"], 
            ["05/12/11", "90kg"],
            ["06/12/11", "89kg"]
];

for (var i = 0; i < times.length; i++) {
    console.log(time[i][0]);  
    console.log(time[i][1]);   
}
1 голос
/ 04 июня 2011

Ваш вывод будет уместным, если оператор log будет читать

console.log(times[i][x]);

Вместо этого вы выводите свой полный новый список newTimes, который инициализируется вне внутреннего цикла и увеличивается с каждой итерацией внутреннего цикла.

1 голос
/ 04 июня 2011

Сделайте это:

var newTimes = [];
for (var i = 0; i < times.length; i++) {
        for(var x = 0; x < times[i].length; x++) {
            newTimes.push(times[i][x]);
            console.log(newTimes);  


        }

    }

Вы заново инициализируете newTimes каждый раз через цикл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...