在 Flex 中使用.contains()
on anArrayCollection
时,它总是会查看内存引用。它似乎没有查看.equals()
方法或.toString()
方法或任何可覆盖的东西。相反,我需要遍历ArrayCollection
每次并检查每个单独的项目,直到找到我正在寻找的东西。
有谁知道为什么 Flex/ActionScript 是这样制作的?为什么不提供一种让人们以contains()
他们想要的方式使用该方法的方法呢?
在 Flex 中使用.contains()
on anArrayCollection
时,它总是会查看内存引用。它似乎没有查看.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 为其创建一个。
您可以通过让您的对象实现 IUID 接口并为该对象提供您自己的 UID 来解决整个默认 UID 问题。ArrayCollection 将查看您提供的 UID。
我建议一个简单的:
in_array($haystack, $arrayCollection->toArray());