2016-04-04 29 views
4

我学习JavaScript在上freecodecamp的那一刻,他们有一个例子嵌套的for循环在他们excercises之一:了解嵌套的for循环在JavaScript

var arr = [[1,2], [3,4], [5,6]]; 
for (var i=0; i < arr.length; i++) { 
    for (var j=0; j < arr[i].length; j++) { 
    console.log(arr[i][j]); 
    } 
} 

用的console.log = 1 2 3 4 5 6未定义。

我理解循环或多或少,并且我明白[i]和[j]用于访问数组(我认为?)。我只是不明白为什么最后它只是打印出这些数字?我发现这个问题问了几年前,但它只是说明了如何写他们,他们也不怎么工作:

For loop in multidimensional javascript array

我打破了它分解成:

var arr = [ [1,2], [3,4], [5,6]];for (var i=0; i < arr.length; i++) { 
console.log(arr[i]);} 

打印出

[ 1, 2 ] 
[ 3, 4 ] 
[ 5, 6 ] 
undefined 

var arr = [ [1,2], [3,4], [5,6]]; 
for (var i=0; i < arr.length; i++) { 
for (var j=0; j < arr[i].length; j++) {  
    console.log(arr[i]); }} 

打印出:

[ 1, 2 ] 
[ 1, 2 ] 
[ 3, 4 ] 
[ 3, 4 ] 
[ 5, 6 ] 
[ 5, 6 ] 
undefined 

var arr = [ [1,2], [3,4], [5,6]]; 
for (var i=0; i < arr.length; i++) { 
    for (var j=0; j < arr[i].length; j++) {  
    console.log(arr[j]); }} 

打印出

[ 1, 2 ] 
[ 3, 4 ] 
[ 1, 2 ] 
[ 3, 4 ] 
[ 1, 2 ] 
[ 3, 4 ] 
undefined 

我明白前两个ARR [i]中。循环遍历数组并打印出各个元素(在这个例子中是一个数组),在第二个循环中,我猜它只是做了两次,因为有两个循环。我不明白的是:

  1. 为什么在ARR [J]数组最后没有打印出来(?哪儿来的 [5,6]去)
  2. 为什么改编[i] [j ]顿时消除了阵列,只是 打印出其中“未定义”数字
  3. 来自

谁能帮我出这一点,并打印出来在控制台前解释代码需要哪些步骤?我真的很想理解它,但是甚至不知道如何正确地搜索这个问题。

+2

不要担心最后的'undefined';这是'console.log()'如何解释代码的副产品。 – Pointy

+0

这是不正确的尖尖。 stellatores在最后得到一个未定义的原因是因为他在循环的最后一个循环中递增我,直到命中条件循环。 For循环将始终运行一次,只有满足条件时才会停止。在这种情况下,最后一个循环将i推到等于7,并且在数组中没有第7个位置。这导致未定义,因为数组位置根本没有分配给它的数字。 – Korgrue

+0

@Korgrue不,Pointy是对的。 i循环在终止之前仅从0运行到2。 'undefined'是'for'语句的返回值。 'console.log('Hi')'做同样的事情:它输出'Hi',然后未定义。 – Stuart

回答

4
var arr = [[1,2], [3,4], [5,6]]; 

这是一个数组的数组。这是一个有点更容易阅读这样的:

var arr = [ 
      [1,2], 
      [3,4], 
      [5,6] 
      ]; 

这使得它有点更容易看到你有3个数组的数组。外部'for'将遍历每个第一级数组。因此,对于i = 0时你要抓住第一内阵列[1,2]环的非常第一外:

for (var i=0; i < arr.length; i++) { 
    //First time through i=0 so arr[i]=[1,2]; 
} 

在您正在通过各3内的要循环的内部循环一次一个数组。

for (var j=0; j < arr[i].length; j++) { 
    //Handle inner array. 
} 

此参数抓住内阵列的长度:通过外环上的第一次

arr[i].length 

所以I = 0和改编[i]是要等于[ 1,2],因为你抓住了第0个元素。请记住,数组中的元素总是计数从0开始,而不是1

最后你用打印出的结果:

console.log(arr[i][j]); 

第一次通过,你可以打破它一点。 i = 0和j = 0。 arr [0] [0]转换为抓取外数组中的第一个元素,然后抓取第一个内数组中的第一个元素。在这种情况下它是“1”:

[ 
    [1,2], <-- 0 
    [3,4], <-- 1 
    [5,6] <-- 2 
]; 

代码将通过第一第一组[1,2],那么第二个[3,4],等等循环。

+0

100%正确。明白了,因此在arr [i] [j]中,您首先获取内部数组,然后将内部数组中的元素打印出来,谢谢!你的数组[0] [0]点击了它。而console.log(arr [j])实际上并不打印出最后一个内部数组,因为它依赖于arr [i],它们是长度为2的内部数组,因此计数器在第三个数组之前停止。非常感谢! – stellatores

1

双for循环你有上述的工作原理是这样:

var arr = [[1,2], [3,4], [5,6]]; 

for (var i=0; i < arr.length; i++) { 
    // i = 0, then we loop below: 
    for (var j=0; j < arr[i].length; j++) { 
    //here we loop through the array which is in the main array 
    //in the first case, i = 0, j = 1, then we loop again, i = 0, j = 1 
    console.log(arr[i][j]); 
    //after we finish the stuff in the 'j' loop we go back to the 'i' loop 
    //and here i = 1, then we go down again, i, remains at 1, and j = 0, then j = 1 
    //....rinse and repeat, 
    } 
} 

在纯英文:

我们抓住主阵列,这本身就是一个数组, 的第一个元素我们通过循环,并记录每个索引,这是由我们在第二个循环中的长度条件终止。然后,我们移动到主数组的下一个索引,这是一个数组本身....直到我们到达主阵列末尾

要访问和索引主数组,我们需要使用array[i] - 该索引保存一个数组 - 所以要进入该数组,我们需要使用array[i][j]

希望有道理!

+0

Pointy对于未定义的 – JordanHendrix

0
  1. 为什么在ARR [J]数组最后不被打印出来(在哪里的[5, 6]去了?)

您可能会注意到,如果你打印出来jconsole.log(j),它会 打印6次,作为0, 1, 0, 1, 0, 1。而你要打印 什么arr[j][5, 6]将不会显示由于其对 arr[2]

  • 为什么改编[i] [j]顿时消除了阵列和仅仅打印出的数字
  • 作为你的状态存在,arr是3个数组的数组。 arr[i]代表 3个阵列,分别是[1, 2],[3, 4][5, 6]。 , arr[i][j]表示这3个数组的索引。这叫做 Multidimensional Arrayarr[i][j]不会消除该数组,但它会选择arr[i]内部的j索引中的值。

  • 其中 '未定义' 来自
  • 这只是铬啄当您使用console.log。 Chrome返回 未定义,每当你尝试这样做。尝试在Firefox上做到这一点,你会不会再看到它。

    0

    尽管使用阵列上进行,在循环的一些​​,他们可以IMO有时会帮助清除混乱中嵌套循环位:

    var arr = [[1,2], [3,4],[5,6]]; 
     
    
     
    for (i in arr){ 
     
         for (j in arr[i]){ 
     
         console.log(arr[i][j]); 
     
         } 
     
        }

    而且code visualization可以澄清执行!