2016-10-07 2 views
0

Я написал очень простое приложение, которое вытягивает все треки из списка плейлистов. Во-первых, он получает объекты JSON дорожки с использованием запроса AJAX и помещает их в массив с именем tracks[].Почему мои определенные строки печатаются на консоль как неопределенные?

Далее я перебираю этот массив и на каждой итерации вытягиваю строки для названия песни и исполнителя для каждого трека. Я помещал их в концентрированную строку. Затем эта строка сохраняется в новом массиве с именем complete. Это делается для каждого трека.

По существу, complete представляет собой массив, который выглядит как

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

На данный момент у меня есть странный вопрос. Согласно отладчику хрома, массив complete имеет все правильные значения внутри него. Однако, когда я пытаюсь сделать console.log любым элементом complete, я получаю значение «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

Ага, которая сделает это (ошибка начинающего, мне стыдно!). Как обычно, я не должен программировать в 10:30 ночи. Также спасибо @relic за вашу честность: D. Лемм тест, чтобы быть уверенным, и я соглашусь в минуту –

+0

Yup, вот и проблема. Спасибо. Не позволю мне принять в течение 6 минут, поэтому я сделаю это, как только это позволит мне. –

1

Ну, в вашем примере выше вы увеличили z (что, как я полагаю, было определено ранее где-то?) После установки значения в вашем массиве. Поэтому, задав значение в массиве, вы установили его в complete[5] (или что-то еще), но вы регистрируете complete[6], что, скорее всего, вне диапазона вашего массива.

Смежные вопросы