5 votes

Javascript : confusion sur le fonctionnement des boucles for imbriquées

Pourquoi faire des imbrications for loops fonctionnent de la manière dont ils le font dans l'exemple suivant :

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

        }

    }

Dans cet exemple, j'aurais pensé que console.log me donnerait la sortie suivante :

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

Cependant, j'ai bien compris :

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

Quelqu'un peut-il m'aider à comprendre cela ?

EDITAR:

Merci pour toutes vos réponses !

9voto

Niklas Points 17865

Vous redéfinissez newTimes à chaque boucle et vous envoyez une sortie à la console à chaque poussée de colonne.

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

Les retours : ["04/11/10", "86kg", "05/12/11", "90kg", "06/12/11", "89kg"] http://jsfiddle.net/niklasvh/SuEdt/

3voto

scrypter Points 90
// 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

1voto

Femi Points 42054

Faites-le :

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

        }

    }

Vous réinitialisez newTimes à chaque fois dans la boucle.

1voto

Howard Points 23487

Votre sortie serait appropriée si l'énoncé du journal était le suivant

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

Au lieu de cela, vous produisez votre nouvelle liste complète newTimes qui est initialisé en dehors de la boucle interne et croît avec chaque itération de la boucle interne.

1voto

Farshid Zaker Points 1081

Le problème se situe dans le deuxième tour de la boucle interne, où il pousse le deuxième élément dans newTimes. De toute façon, je ne comprends pas la raison de la boucle interne. Vous pouvez écrire beaucoup plus simplement :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X