При использовании .contains() на ArrayCollection в Flex он всегда будет смотреть на ссылку памяти. Похоже, что он не смотрит на метод .equals() или метод .toString() или что-нибудь, что можно переопределить. Вместо этого мне нужно каждый раз перебирать ArrayCollection и проверять каждый отдельный элемент, пока я не найду то, что ищу.
Кто-нибудь знает, почему именно так сделали Flex / ActionScript? Почему бы не предоставить людям возможность использовать метод contains() так, как они хотят?





Не могли бы вы просто расширить ArrayCollection и переопределить метод contains ()? В качестве альтернативы вы можете вставить исходный код для ArrayCollection в пакет «mx / collections» в своем проекте и изменить исходный код; эта «техника исправления обезьяны» переопределит поведение на протяжении всего вашего проекта. Однако я был бы крайне осторожен при изменении ArrayCollection таким образом: поскольку он используется повсеместно в API Flex, есть большая вероятность, что вы начнете нарушать работу других компонентов в структуре.
Метод contains () выполняет поиск по ссылке, правильно (я считаю, даже для примитивов), поэтому, если вы пытаетесь найти строку или int в ArrayCollection, вам придется выполнить поиск самостоятельно, с помощью некоторого варианта цикла или поиск. Я не думаю, что кто-либо из нас может сказать вам, почему в этом методе нет, скажем, необязательного параметра, указывающего, следует ли искать по ref или по val; так оно и есть, как говорится.
Но я бы определенно предостерегал вас от обезьяньего исправления кода фреймворка - это просто напрашивается на неприятности. :)
Что ж, похоже, что ArrayCollection на самом деле не смотрит напрямую на память, а только в крайнем случае. Он попытается найти уникальный идентификатор (UID) для объекта. Если UID не существует, он будет создан для него с помощью UIDUtil.as.
Вы можете обойти весь этот материал UID по умолчанию, если ваш объект реализует интерфейс IUID и предоставит свой собственный UID для объекта. Коллекция ArrayCollection будет проверять предоставленный вами UID.
Извините, это отрицательный результат. Я не знаю, какие источники вы просматриваете, но в источниках из 3.2 используется «==» для поиска элемента, если применена функция filterFunction, и ArrayUtil.getItemIndex («===»), если ArrayCollection не отсортирован. Если его отсортировать, все усложняется, но проверки UID по-прежнему нет.
-1: Просто попробовал предложенное использование интерфейса IUID, но реализованные методы никогда не вызываются ... к сожалению ... Это было бы неплохо.
Я бы посоветовал простое:
in_array($haystack, $arrayCollection->toArray());
Я разделяю вашу боль - мне постоянно хочется, чтобы в Flex была встроена модель equals / getHashCode.