Оператор $ .each останавливается, когда достигает «неопределенного» значения - PullRequest
2 голосов
/ 31 декабря 2011

При работе с маркерами Google Maps V3 я сохраняю имя каждого маркера в массиве, чтобы можно было быстро удалить их все с карты одновременно.Однако по какой-то причине, когда я вызываю свою функцию, которая должна выполнять итерацию по всему массиву, удаляя все маркеры в течение длительного времени, функция возвращает неопределенное значение после удаления только нескольких маркеров.

Массив (markersArray) перед функцией:

["markerZip02111", "markerZip02139", "markerZip01002", "markerZip94602", "markerZip02460"]

Код функции:

function removeAllMarkers(exceptId) {
    $.each(markersArray, function(index, value) {
        if(value != exceptId) {
            eval(value+".setMap(null);");
            markersArray.splice(value, 1);
            console.log(value);
        }
    });
}

Что отображает консоль:

markerZip02111
markerZip01002
markerZip02460
undefined

Массив после запуска функции:

["markerZip94602", "markerZip02460"]

Ясно, что массив успешно работает, пока не достигнет «неопределенного» значения, а затем остановится.Что я могу сделать, чтобы обойти эту проблему ??

Ответы [ 3 ]

3 голосов
/ 31 декабря 2011

Я почти уверен, что причина, по которой вы получаете неопределенное значение во время итерации, когда в вашем начальном массиве нет неопределенных значений, заключается в том, что вы удаляете элементы из массива во время итерации.Я предполагаю, что это сбивает с толку итератор jQuery $.each().

Если вы посмотрите на свой вывод, то произойдет следующее:

1st Iteration
    index === 0, array is["markerZip02111", "markerZip02139", "markerZip01002",
                          "markerZip94602", "markerZip02460"]
    item 0 "markerZip02111" gets removed, shifting all the later elements up
2nd Iteration
    index === 1, but now array is ["markerZip02139", "markerZip01002",
                                   "markerZip94602", "markerZip02460"]
    item 1 "markerZip01002" gets removed, shifting all the later elements up
3rd Iteration
    index ===2, but now array is ["markerZip01002", "markerZip94602",
                                  "markerZip02460"]
    so the last item "markerZip02460" gets removed
4th Iteration
    index === 3, but now array only has two elements so value
    at that index is undefined.

Обратите внимание, что два элемента никогда не были оценены:итератор пропустил их, потому что вы изменили их индексы, удалив элементы.

Если вы должны удалять элементы по ходу, это легко сделать с помощью обычного цикла for, который повторяет в обратном направлении, так что удаление элементов не приводит к повреждению счетчика цикла,(Или вы можете использовать обычный цикл for для продвижения вперед, если вы настраиваете переменную счетчика каждый раз, когда удаляете элемент.)

Кроме того, когда вы выполняете сращивание, вам нужно передать индекс элемента какпервый параметр, а не значение элемента.Так что markersArray.splice(index, 1); не markersArray.splice(value, 1);.

Итак, что-то вроде:

function removeAllMarkers(exceptId) {
   var value;
   for (var i = markersArray.length - 1; i >= 0; i--) {
      value = markersArray[i];
      if (value != exceptId) {
         markersArray.splice(i, 1);
         eval(value+".setMap(null);");
         console.log(value + " removed");
      }
   }
}
2 голосов
/ 31 декабря 2011

Я думаю, что dotnetstep прибил его, но вы также можете попробовать обернуть логику внутри $.each с помощью try / catch для более широкой обработки:

http://www.w3schools.com/js/js_try_catch.asp

Удачи!

1 голос
/ 31 декабря 2011
   $.each(markersArray, function (index, value) {            
             if (value != null && value != undefined  && value!= exceptId) {
                 eval(value + ".setMap(null);");
                 markersArray.splice(value, 1);
                 console.log(value);
             }
         });
...