2011-12-31 7 views
0

Я сохраняю все объекты маркера Google Maps в одном массиве. Сейчас я пытаюсь настроить функцию, которая удалит все маркеры в массиве с карты, но у меня возникают проблемы с циклом.Итерация через многомерный массив Javascript, заполненный объектами маркеров Google Maps

Во-первых, я ставлю каждый маркер в массиве таким образом:

eval("markerZip"+value.zip+" = new google.maps.Marker({map: map, icon: '/images/mapmarker.php?m=zip_marker.png', position: zipCenter});"); 
eval("markersArray['markerZip"+value.zip+"'] = markerZip"+value.zip); 

Затем, когда я хочу, чтобы удалить маркеры я сделать это:

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

Однако переборе массив Безразлично» похоже, ничего не делает. Это как если массив пуст, потому что строка console.log ничего не возвращает. Когда я показываю массив в моей консоли, она показывает «[]» (который я затем нажмите, чтобы отобразить дочерние объекты), который содержит:

markerZip01002 
    U { gm_accessors_={...}, map=U, b=U, more...} 

markerZip02111 
    U { gm_accessors_={...}, map=U, b=U, more...} 

markerZip02135 
    U { gm_accessors_={...}, map=U, b=U, more...} 

markerZip02139 
    U { gm_accessors_={...}, map=U, b=U, more...} 

markerZip02466 
    U { gm_accessors_={...}, map=U, b=U, more...} 
+1

Почему вы используете 'eval()' вместо того, чтобы просто писать соответствующий код javascript? – jfriend00

ответ

1

Вопрос заключается в том, что вы используете массив в качестве хэш или словарь , jQuery проверяет, имеет ли объект, который был передан, length - see here для реализации. Поскольку вы передаете массив, он выполняет итерацию над значениями в массиве, к которым можно получить доступ через целые ключи от 0 до obj.length - 1. Поскольку в вашем массиве нет значений, к которым можно получить доступ таким образом, цикл немедленно прекращается.

Вы лечите ваш markersArray как объект JavaScript, а не массив - так что вы бы лучше использовать {}, а не [] для markersArray объекта.

<rant> Кроме того, нет необходимости использовать eval для установки ключей в хеше - когда-либо. Это неэффективно - вам нужно запустить новую версию среды выполнения JavaScript для каждого вызова eval. Он хрупкий - вы пишете строки, которые содержат код и вводят другие строки внутри них - неуместно " или // в ваших данных может остановить вашу программу холодным. И, наконец, это требует постоянного использования глобальной сферы действия, чего следует избегать всякий раз, когда вы не делаете собственный глобальный охват. </rant>

Вы можете заменить эти две строки:

eval("markerZip"+value.zip+" = new google.maps.Marker({map: map/*etc.*/});"); 
eval("markersArray['markerZip"+value.zip+"'] = markerZip"+value.zip); 

с этой одной строке:

// Assume we did this earlier 
// var markersHash = {}; 
markersHash["markerZip"+value.zip] = new google.maps.Marker({map: map /*etc.*/}); 

Когда вы сделаете это, ваш призыв к $.each будет работать, как ожидалось.

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