Apache flex 为什么Flex';s ArrayCollection';s包含方法查看内存引用?

Apache flex 为什么Flex';s ArrayCollection';s包含方法查看内存引用?,apache-flex,programming-languages,arraycollection,Apache Flex,Programming Languages,Arraycollection,在Flex中的ArrayCollection上使用.contains()时,它将始终查看内存引用。它似乎没有查看.equals()方法或.toString()方法或任何可重写的内容。相反,我每次都需要遍历ArrayCollection,检查每个项目,直到找到我要查找的内容 有人知道为什么Flex/ActionScript是这样制作的吗?为什么不提供一种方法让人们按照自己的意愿使用contains()方法呢?您不能扩展ArrayCollection并重写contains()方法吗?或者,您可以将A

在Flex中的
ArrayCollection
上使用
.contains()
时,它将始终查看内存引用。它似乎没有查看
.equals()
方法或
.toString()
方法或任何可重写的内容。相反,我每次都需要遍历
ArrayCollection
,检查每个项目,直到找到我要查找的内容


有人知道为什么Flex/ActionScript是这样制作的吗?为什么不提供一种方法让人们按照自己的意愿使用
contains()
方法呢?

您不能扩展ArrayCollection并重写contains()方法吗?或者,您可以将ArrayCollection的源文件粘贴到项目中的“mx/collections”包中,并修改源文件;这种“猴子修补技术”将覆盖整个项目中的行为。但是,我对以这种方式更改ArrayCollection会非常谨慎:因为它在Flex API中被广泛使用,所以很有可能会破坏框架中的其他组件。

contains()方法通过引用进行搜索,正确(我相信即使是原语),因此,如果您试图在ArrayCollection中查找字符串或int,您必须自己进行搜索,通过一些循环或搜索的变体。我不认为我们中的任何人都能告诉你为什么这个方法上没有一个可选的参数来指示是按ref还是按val进行搜索;就像他们说的那样


但我绝对要警告你不要在框架代码上打补丁——那只会自找麻烦。:)

看来ArrayCollection实际上并没有直接查看内存,只是作为最后的手段。它将尝试查找对象的唯一ID(UID)。如果UID不存在,它将使用UIDUtil.as为其创建一个UID


通过让对象实现IUID接口并为对象提供自己的UID,您可以绕过整个默认UID。ArrayCollection将查看您提供的UID。

我建议一个简单的方法:

in_array($haystack, $arrayCollection->toArray());

我和你一样痛苦——我一直希望Flex内置一个equals/getHashCode模型。对不起,这是一个负面影响。我不知道您正在查看哪些源,但是如果应用了filterFunction,则3.2中的源使用“==”查找项,如果ArrayCollection未排序,则使用ArrayUtil.getItemIndex(“==”)。如果它被排序,它会变得更复杂,但仍然没有UID检查。-1:只是尝试了IUID接口的建议用法,但实现的方法从未被调用。。。不幸的是。。。不过这是一个不错的功能。