Итерация по многомерному массиву Javascript, заполненному объектами маркеров Google Maps - PullRequest
0 голосов
/ 31 декабря 2011

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

Сначала я поместил каждый маркер в массив следующим образом:

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 Ответ

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

Проблема в том, что вы используете массив в качестве хэша или словаря. jQuery проверяет, имеет ли переданный объект свойство length - , см. здесь для реализации. Поскольку вы передаете массив, он перебирает значения в массиве, к которым можно получить доступ через целочисленные ключи от 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 будет работать как положено.

...