2016-10-07 88 views
0

我已经编写了一个非常简单的应用程序,可以将Spotify播放列表中的所有音轨关闭。首先,它使用AJAX请求获取跟踪JSON对象,并将它们放入一个名为tracks[]的数组中。为什么我定义的字符串作为未定义打印到控制台?

接下来,我遍历这个数组,并且在每次迭代中,我都会为每首曲目的歌曲名称和艺术家提取字符串。我把它们放在一个集中的字符串中。然后将该字符串存储在名为complete的新数组中。这是为每个轨道完成的。

从本质上讲,complete是看起来像

[ 
    "Sympathy for The Devil, The Rolling Stones", 
    "Come Together, The Beatles", 
    ... 
] 

在这一点上我有一个奇怪的问题的数组。根据chrome的调试器,数组complete具有所有正确的值。但是,当我试图console.logcomplete的任何元素时,最终的值为'undefined'。陌生人呢,如果我用console.log这个表达式来得到两个字符串并将它们缝合起来,它就会打印出正确的值。

为什么会出现这种情况,我该如何解决它,因此它可以console.log正确的价值观

这里是通过存储JSON对象进行迭代,将它们存储在新数组的代码,并打印:

function print() { 
    for(var x = 0; x < 4; x++) { 
     for(var n = 0; n < 100; n++) { 
      try { 
       //this logs correct 
       console.log(tracks[x].items[n].track.name + " " + tracks[x].items[n].track.artists[0].name); 

       //these have correct value 
       var deb = (tracks[x].items[n].track.name + " " + tracks[x].items[n].track.artists[0].name); 
       complete[z] = deb; 
       z++; 

       console.log(deb); //throws no error, prints fine 
       console.log(complete[z]); //prints undefined 

      } catch(err) { 
       //no exception ever thrown 
      } 
     } 
    } 
} 

我不会做太多的JS,对不起,如果我失去了明显的东西。

+1

你在哪里声明'complete'是一个数组,而'z'声明为int? –

+0

@Œlrim在脚本的开头,就在这个函数被调用之前:'var complete = new Array(400);'如果这是不正确的,我道歉,如果你说不出来,我不会做太多的JS; ) –

回答

1

在分配complete[z]之后,您正在递增z。打印时,您不再访问complete[z],但complete[z+1]尚未定义。尝试在console.log命令后移动增量。

+0

打败了我超过30秒... – relic

+0

阿哈会做到这一点(一个begginer的错误,我很惭愧!)。像往常一样,我不应该在晚上10点30分编程。还@relic感谢您的诚实:D。让我测试一下,我会接受一分钟 –

+0

是的,这就是问题所在。谢谢。 6分钟不会让我接受,所以一旦它让我参加,我会做。 –

1

那么,在你上面的例子中,在你设置数组的值之后,你增加了z(我认为它是在某处定义的?)。所以当设置数组的值时,你已经将它设置为complete[5](或其他),但是你的日志记录为complete[6],这很可能超出了你的数组范围。