2015-08-17 3 views
0

У меня есть для цикла, но он выполняется, когда он должен выполняться два раза.Javascript - цикл повторяется только один раз?

Переменная $ переменная содержит возвращенные данные из вызова ajax. Когда я console.log ($ assignments.length) Я получаю два правильных значения, но итерация происходит только один раз, и я не могу понять, почему.

 for (var i = 0; i < $appointments.length; i+=1) { 

      var rangeStart_hour = $appointments[i].timerange.substring(0, 2); 
      var rangeStart_minutes = $appointments[i].timerange.substring(3, 5); 
      var rangeEnd_hour = $appointments[i].timerange.substring(11, 13); 
      var rangeEnd_minutes = $appointments[i].timerange.substring(14, 16); 
      var rangeS = rangeStart_hour + rangeStart_minutes; 
      var rangeE = rangeEnd_hour + rangeEnd_minutes; 
      var rangeStart = parseInt(rangeS); 
      var rangeEnd = parseInt(rangeE); 
      var range=0; 

      if(parseInt(rangeStart_hour) == 12){ 
      if(parseInt(rangeStart_minutes) == 0){ 
       range = rangeEnd - 0; 
      }else{ 
       range = rangeEnd - (parseInt(rangeStart_minutes)+20); 
      } 
      }else{ 
      if(parseInt(rangeStart_minutes) == 30 && parseInt(rangeEnd_minutes) == 0){ 
       // if start time 1:30 ,end time 3:00 
       range = (rangeEnd - (rangeStart + 20)); // 300 - 150 = 150 
      }else if(parseInt(rangeStart_minutes) == 0 && parseInt(rangeEnd_minutes) == 30){ 
       range = ((rangeEnd+20) - rangeStart); 
      }else{ 
       range = rangeEnd - rangeStart; 
      } 
      } 

      console.log(range); 

      for(var i=1; i<(range/50); i++){ 
      $("a[data-time='"+(rangeStart)+"']").addClass('time'); 
      rangeStart += 50; 
      }; 
     }; 

ответ

5

Эта структура выглядит как плохая идея:

for (var i = 0; i < $appointments.length; i += 1) { 
    //... 
    for (var i = 1; i < (range/50); i++){ 
     //... 
    } 
} 

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

+0

jesus Я думаю, мне нужно немного поспать. –

+4

Кроме того, у вас не было бы этой проблемы, если бы вы разделили свой код и не выполнили всю свою логику в одной материнской функции. – Jan

+0

side-note, ключевое слово 'let' также может решить эту проблему, как только поддержка браузера для него будет более распространенной. –

5

Вы переинициализировать переменную i во втором цикл, если вы измените

for(var i=1; i<(range/50); i++){ 
    $("a[data-time='"+(rangeStart)+"']").addClass('time'); 
    rangeStart += 50; 
}; 

использовать другие переменный, скажу j он должен работать нормально.

1

Важно: У JavaScript нет блока. Переменные, введенные с блоком, привязаны к содержащейся функции или скрипту, а эффекты их настройки сохраняются за пределами самого блока. Другими словами, операторы блоков не вводят область. Хотя «автономные» блоки являются допустимым синтаксисом, вы не хотите использовать автономные блоки в JavaScript, потому что они не делают то, что, по вашему мнению, они делают, если вы думаете, что они делают что-то вроде таких блоков на C или Java.

В вашем коде «я» переменная используется дважды, так второй раз инициализируется значение инкремента в первом для цикла. Поэтому в первом Условие для цикл и цикл завершаются. Измените имя переменной во втором или первом на цикл, тогда он будет работать так, как вы ожидали

1

В JavaScript область видимости переменной - это область функций. Это означает, что все объявления переменных поднимаются в начало функции. Таким образом, в вашем случае:

for (var i = 0; i < $appointments.length; i += 1) { 
    ... 
    for (var i = 1; i < (range/50); i++){ 
     ... 
    }; 
}; 

равных с

var i; // two variables with the same name are hoisted as the same variable. 

for (i = 0; i < $appointments.length; i += 1) { 
    ... 
    for (i = 1; i < (range/50); i++){ 
     ... 
    }; 
}; 

Так, в конце второго цикла, "я" будет больше или равна RANGE/50. Если это значение не меньше $ assignments.length, первый цикл завершится после первого раунда.

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