Переменная становится неопределенной в последней итерации цикла

0

У меня есть приложение, где я получаю информацию о маршруте из одного места в другое, возможно, между несколькими местоположениями. В моей функции я перебираю выбранные местоположения и записываю маршруты на страницу с помощью jQuery. На последней итерации цикла переменная 'myRoute' становится неопределенной. Итак, если у меня есть три места, он бомбит третий, но если я использую те же три и добавлю четвертый, первые три работы и четвертые бомбы. Я отслеживал поведение в Firebug, и хотя переменная myRoute заполняется должным образом, как только она переместится на следующую строку, она внезапно не определена. Я удалил экземпляры myRoute и заменил directionResult.routes[0].legs[i] но все еще получил неопределенную ошибку. Что здесь происходит?

function setInstructions(directionResult, idname, start) {
//clean tour list
$('#tours_list .tour').remove();
$('#routeTitle').show();
var checkboxArray = $(".selector.Favs" + idname).find("li");
var idx = 0;

var linkMap = $('#routeTitle').find('.link-map')[0];
linkMap.href = __mapLink+'saddr=' + start;
var firstStop = true;
//iterate selected properties
for (var i = 0; i < checkboxArray.length; i++) {
    var curChk = checkboxArray[i];
    if ($(curChk).hasClass('active')) {        
        //get steps
        var myRoute = directionResult.routes[0].legs[i]; //this is what becomes undfined
        var title = $('<div>').addClass('mileage').append($('<p>').append($('<strong>').html(myRoute.distance.text + "<br /> about " + myRoute.duration.text)));
        var ol = $('<ol>').addClass('directions');
        for (var j = 0; j < myRoute.steps.length; j++) {
            var step = myRoute.steps[j];
            var li = $('<li>').append($('<div>').addClass('direction').html(step.instructions));
            li.append($('<div>').addClass('distance').html(step.distance.text + " - " + step.duration.text));
            ol.append(li);
        }                      
        //add tour with directions
        $('#tours_list').append(temp);          
    }
}

}

  • 3
    Очевидный вопрос - это directionResult.routes[0].legs[i] . Сколько элементов в directionResult.routes[0].legs ? Если их меньше, чем checkboxArray.length , это объясняет, почему вы получаете undefined в конце цикла.
  • 0
    В checkboxArray есть еще кое-что, но экземпляр создается только в том случае, если у элемента есть класс Active. Если я ожидаю 3 (выбрано 3 элемента), оператор if будет в три раза вернее, чем ожидалось. Я установил точку останова, и в третий раз myRoute содержит правильные данные, но когда я ухожу туда, где установлен заголовок, myRoute внезапно становится неопределенным.
Показать ещё 1 комментарий
Теги:

1 ответ

1
Лучший ответ

Проблема в том, что массив в directionResult.routes[0].legs не до тех пор, пока checkboxArray.length поэтому ваш код пытается получить доступ за пределами directionResult.routes[0].legs и, таким образом, не undefined.

Это не помогает вам тестировать только активные элементы класса, потому что i перехожу от 0 до checkboxArray.length - 1 независимо.


Я не выполняю точно то, что вы пытаетесь сделать, но вы можете обойти это, только перебирая элементы, которые имеют.активный, в первую очередь, поэтому i никогда не выхожу за пределы количества активных элементов. Вы могли бы это сделать, изменив это:

var checkboxArray = $(".selector.Favs" + idname).find("li");

к этому:

var checkboxArray = $(".selector.Favs" + idname).find("li.active");

И затем удалите if check для активного класса. Это сделает это так, указательный i никогда не поднимается выше, чем число активных элементов.


Вы также можете просто сохранить счетчик активных элементов, которые вы обработали, и использовать этот счетчик для индексации в directionResult.routes[0].legs[cntr] вместо использования i.

  • 0
    Вы поставили меня в правильном направлении в ваших комментариях выше. Я вычел 1 из i и получил правильные результаты, но затем получил ту же идею просто получить соответствующие элементы списка. Спасибо за вашу помощь с этим!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню