Клуб API Карт

Странное поведение .each при выводе меню коллекций.

Пост в архиве.

https://tech.yandex.ru/maps/jsbox/2.1/ymapsml_menu

 

Делал все по примеру, отличия практически 0, за исключением странного факта,

если в функцию addMenuItem добавтьб вывод меток во время создания списка, то res.geoObjects.each(function (item)  начинает обрабатываеть только нечетные коллекции из объекта сформированного res.geoObjects .

 

Почему ? 

function addMenuItem(group, map) {

        myMap.geoObjects.add(group);

        $("<a class=\"title\" href=\"#\">" + group.properties.get('name') + "</a>")

        .bind("click", function () {

            var link = $(this);

                if (link.hasClass("active")) {

                    map.geoObjects.remove(group);

                    link.removeClass('active');

                } else {

                    map.geoObjects.add(group);

                    link.addClass('active');

                }

                return false;

            })

            .appendTo(

                $("<li></li>").appendTo($("#menu"))

                ).addClass('active');

        }   

    }

3 комментария
Sergey Konstantinov
27 января 2016, 22:20
Добавление элемента в другую коллекцию эквивалентно удалению из текущей. each в этом месте ведёт себя как и положено. Ср.
var arr = [1, 2, 3]; arr.forEach(function (elem, i) { console.log(elem); arr.splice(i, 1); });
Евгений Косенко
27 января 2016, 22:20

Тобешь каждый раз выполняя 

myMap.geoObjects.add(group); 

я добавляю элемент в новую коллекцию ?

Но пр чем тут тогда обработка нечетных элементов если с ними ничего не происходит ?

имеем arr [1,2,3,4,5,6]

если не используем myMap.geoObjects.add(group); выводим :

1 , 2 , 3 , 4, 5 ,6 

если используем, то выводим :

1 , 3 , 5 


всеравно не понимаю почему таком случае объекты 2,4,6 просто попускаются.

В JavaScript есть только Array, а не List.

Вы элемент удалили массив стал короче, а индекс следующего при переборе этого не учитывает.

Используйте while и всё.

var geoObject;

while(geoObject = group.get(0)) {

map.geoObjects.add(geoObject)

}