Почему метод Contain класса Flex ArrayCollection просматривает ссылку на память?

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

Кто-нибудь знает, почему Flex/ActionScript был сделан таким образом? Почему бы не дать людям возможность использовать метод contains() так, как они хотят?


person DyreSchlock    schedule 23.12.2008    source источник
comment
Я разделяю вашу боль — я постоянно желаю, чтобы во Flex была встроена модель equals/getHashCode.   -  person Richard Szalay    schedule 29.12.2008


Ответы (4)


Не могли бы вы просто расширить ArrayCollection и переопределить метод contains()? В качестве альтернативы вы можете вставить исходный код для ArrayCollection в пакет "mx/collections" в своем проекте и изменить исходный код; эта «техника исправления обезьяны» переопределит поведение во всем вашем проекте. Однако я был бы чрезвычайно осторожен в изменении ArrayCollection таким образом: поскольку он повсеместно используется в API-интерфейсах Flex, есть большая вероятность, что вы начнете ломать другие компоненты в фреймворке.

person cliff.meyers    schedule 27.12.2008

Метод contains() ищет по ссылке, правильно (я полагаю, даже для примитивов), поэтому, если вы пытаетесь найти строку или целое число в ArrayCollection, вам придется выполнять поиск самостоятельно с помощью некоторого варианта цикла или поиск. Я не думаю, что кто-либо из нас мог бы объяснить вам, почему в этом методе нет, скажем, необязательного параметра, указывающего, следует ли искать по ref или по val; так оно и есть, как говорится.

Но я бы определенно предостерег вас от обезьяньих исправлений кода фреймворка - это просто напрашивается на неприятности. :)

person Christian Nunciato    schedule 31.12.2008

Ну, похоже, что ArrayCollection на самом деле не смотрит прямо на память, а только в крайнем случае. Он попытается найти уникальный идентификатор (UID) для объекта. Если UID не существует, он будет создан для него с помощью UIDUtil.as.

Вы можете обойти весь этот материал UID по умолчанию, если ваш объект реализует интерфейс IUID и предоставит свой собственный UID для объекта. ArrayCollection будет смотреть на предоставленный вами UID.

person DyreSchlock    schedule 02.04.2009
comment
Извините, это минус. Я не знаю, на какие источники вы смотрите, но те, что из 3.2, используют == для поиска элемента, если применяется filterFunction и ArrayUtil.getItemIndex (===), если ArrayCollection не отсортирован. Если он отсортирован, все становится сложнее, но проверки UID все еще нет. - person bug-a-lot; 15.03.2010
comment
-1: только что попробовал предложенное использование интерфейса IUID, но реализованные методы никогда не вызываются... к сожалению... Хотя это было бы неплохой функцией. - person Matyas; 16.05.2012

Я бы предложил простой:

in_array($haystack, $arrayCollection->toArray());
person Zjoia    schedule 10.02.2014