Клуб API Карт

Баг с GeoObjectArray.add(child, index) vs get(index)

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

Продолжаем перечислять выявленные баги в API 2.0. Благо теперь клуб не в режиме R/O работает.

Итак: имеем все теже 100500 маркеров Placemark обозначающие объекты разного типа и каждый со своим ID.

Исторически сложилость, что проще и быстрее было работать с ними используя массивы объектов Placemark, т.е. работать с ними по принципу markers[id] = new Placemark(...);

Однако с ростом их кол-ва на карте возникла необходимость увеличить производительность фильтра отображения маркеров по их типу, т.е. управлять группами маркеров на основе их типа.

Выбор пал на GeoObjectArray ибо в моем случае все объекты обязательно имели свой ID (натуральные числа, но вовсе не обязательно последовательные, т.е. 2,5,17,99,1023 и т.д.) и в коде достаточно много отсылок к работе именно через эти ID объектов.

Отдельно порадовал дополнительный параметр index при добавлениии в группу add(child, index), т.к. для последующих обращений мне нужно чтобы индекс маркера в группе был именно мой, а не последовательный от 0 по умолчанию.

Заполнив GeoObjectArray маркерами с моими индексами приступаем к работе с ними через  GeoObjectArray.get(index) и обнаруживаем, что таких объектов НЕТ в группе! Как? Убиваем еще неск.часов на поиск прочих возможных ошибок в коде, в итоге сведя все к использованию числовых констант вместо переменных и все равно get(index) уверенно возвращает null, т.е. 2й параметр в методе add(child, index) явно игнорируется. В итоге пришлось вернуться к "классике" работы с массивами...

Просьба исправить этот баг, а также небольшой фичреквест на будущее:

Фичреквест: Предусмотрите более гибкие группы объектов, которые позволяют один и тот же элемент включать в несколько групп на основе разных независимых атрибутов объектов.

7 комментариев

Это не баг, а нормализация индексов.

 

В 2.1 сделали только один тип коллекции и нормализацию убрали.

Поддержка включения одного элемента сразу в несколько коллекций пока не планируется.

 

Это не баг, а нормализация индексов.

Тогда для чего было 2й index параметр вводить дабы вводить в заблуждение? Добавляем с одним индексом, а читать надо уже другой...бр. Актуализируйте документацию хотя бы. Если индексы не соответствуют заданным при добавлении, то GeoObjectArray попросту не нужен вообще ибо цитирую:

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

--------

Поддержка включения одного элемента сразу в несколько коллекций пока не планируется.

Снова печалька...

Я с вами согласен, нормализация вводит в заблуждение

В 2.0 у GeoObjectArray метод add работает как push,

именно поэтому мы от нее и отказались в 2.1

кстати я в свое время сделал реализацию Array-like коллекции без нормализации.

В ней все индексы сохраняются, и интерфейс полностью идентичен GeoObjectArray

Вот пример использования

Спасибо, что услышали меня)

Подправьте пож-та документацию, а лучше уберите вообще этот параметр в описании текущей и релизной версии.

PS push() в стандартных массивах javascript итак уже есть, хотелось чтото более функциональное.

PPS Ваш пример посмотрел, у меня реализация короче вышла с []

 

 

 

 

Посмотрите в сторону geoQueryResult, он позволяет включать объект в несколько выборок сразу. Сразу оговорюсь, что задать в него разряженные массивы тоже не получится.

Спасибо за совет, но, как написал выше, меньше кода и больше стабильности получается при использовании простых массивов в javascript и меньше зависимость от внешних факторов ибо обращения по индексам занимают значительную часть логики.... да еще необходимость группировок по перекрывающимся атрибутам сказываются.