2008-12-23 32 views
5

在Flex中的ArrayCollection上使用.contains()時,它總是會查看內存引用。它似乎沒有查看.equals()方法或.toString()方法或任何可覆蓋的方法。相反,我需要每次循環訪問ArrayCollection,並檢查每個單獨的項目,直到找到所需的項目。爲什麼Flex的ArrayCollection的Contain方法查看內存引用?

有誰知道爲什麼Flex/ActionScript是這樣做的?爲什麼不提供一種方法讓人們以他們想要的方式使用方法?

+0

我分擔你的痛苦 - 我經常希望的是Flex的有建於等號/ GetHashCode的模式 – 2008-12-28 22:48:31

回答

2

好吧,它看起來像ArrayCollection實際上並不直接看內存,但只是作爲最後的手段。它將嘗試爲對象查找唯一ID(UID)。如果UID不存在,它將使用UIDUtil.as爲其創建一個。

您可以通過讓對象實現IUID接口併爲對象提供自己的UID來解決整個默認UID的問題。 ArrayCollection將查看您提供的UID。

+3

對不起,這是消極的。我不知道你在看什麼源代碼,但是如果ArrayCollection沒有排序,那麼3.2中的代碼會使用「==」來查找該項是否存在filterFunction應用,ArrayUtil.getItemIndex(「===」)。如果它被排序,它會變得更加複雜,但是仍然沒有UID檢查。 – 2010-03-15 06:53:47

2

你不能只擴展ArrayCollection並重寫contains()方法嗎?或者,您可以將ArrayCollection的源代碼粘貼到項目中的「mx/collections」包中,然後修改源代碼;這個「猴子修補技術」將覆蓋整個項目中的行爲。不過,我會非常謹慎地以這種方式更改ArrayCollection:因爲它在Flex API中被廣泛使用,您很可能會開始打破框架中的其他組件。

2

contains()方法通過引用進行搜索,正確(我相信即使對於基元),所以如果你想在ArrayCollection中找到一個字符串或一個int,你必須自己做搜索,循環或搜索的一些變化。我不認爲我們中的任何一個人可以告訴你,爲什麼在該方法中沒有可選參數,指示是通過ref還是通過val進行搜索;就像他們所說的那樣。

但是我絕對會警告你不要修改框架代碼 - 這只是要求麻煩。 :)

0

我建議一個簡單的:

in_array($haystack, $arrayCollection->toArray()); 
相關問題