Клуб API Карт

Перенос объектов из GeoObjectCollection

Вожжов Артём
22 июня 2015, 17:34

Всем привет!

 

Столкнулся с проблемой следующего характера: у меня есть GeoObjectCollection с объектами GeoObject и мне нужно из этой коллекции перенести объекты в другие коллекции.

 

Вот как я делаю

 

var collection = new ymaps.GeoObjectCollection(),
collectionEven = new ymaps.GeoObjectCollection(),
collectionOdd = new ymaps.GeoObjectCollection();

// здесь добавлены объекты в коллекцию collection

// а затем я хочу раскидать объекты по соотвествующим коллекциям.
collection.each(function (geoObject, i) {
if (i % 2 == 0)
collectionEven.add(geoObject);
else
collectionOdd.add(geoObject);
});

// и тут я обнаруживаю, что не все элементы коллекции collection были перенесены
// а половина
console.log(collection.getLength());

Что я делаю неправильно?

ЗЫ Пытался делать с помощью итератора, та же фигня:(

4 комментария
Подписаться на комментарии к посту

Перенос элементов из коллекции это смена родителя и как следствие удаление из текущей коллекции.

То есть это как удалять элементы из массива при переборе.

 

Можно сделать так:

while(collection.getLength()) {

    ...

}

или даже так 

var geoObject;

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

    ...

}

 

Но кажется проще использовать ymaps.geoQuery

Вожжов Артём
22 июня 2015, 23:44

Спасибо за ваш ответ. Но ни один из примеров не подойдет, так как GeoObjectCollection, в отличии от GeoObjectArray, не имеет возможность получать элемент по индексу. В этом вся и проблема. Данные получаю из ymaps.regions.load.

 

А как с geoQuery? Можете пример накидать?

GeoObjectCollection умеет получать элемент по индексу через метод get, как указано в примере. (https://tech.yandex.ru/maps/doc/jsapi/2.1-dev/ref/reference/GeoObjectCollection-docpage/)
Вожжов Артём
23 июня 2015, 09:18

Да, действительно. Очень странно, но я помню, что смотрел все методы этого класса и точно не видел там .get().

 

Спасибо всем за помощь, моя проблема решена!