如何查找具有特定属性值的ArrayCollection项?

Gio*_*rdi 5 apache-flex syntax actionscript

我有一些像这样的XML结构:

var struct:XML = <mh>
  <mi id="1" stuff="whatever"/>
  <mi id="2" stuff="whatever"/>
  <mi id="3" stuff="whatever"/>
</mh>;
Run Code Online (Sandbox Code Playgroud)

我知道我可以通过"id"访问子节点,这样:

var stuff:Object = struct.(hasOwnProperty('@id') && @id == '2').@stuff;
Run Code Online (Sandbox Code Playgroud)

现在我有一些类似的ArrayCollection结构:

private var cmenu:ArrayCollection = new ArrayCollection([
    {id:"1", stuff:"whatever"},
    {id:"2", stuff:"whatever"},
    {id:"3", stuff:"whatever"}
]);
Run Code Online (Sandbox Code Playgroud)

我想知道是否可以以类似的方式访问项目,如下所示:

var stuff:Object = cmenu['id == 2'].stuff;
Run Code Online (Sandbox Code Playgroud)

可能吗?

Her*_*rms 18

你可以稍微概括一下Matt的答案,这样你就可以传入你想要的ID值而不是硬编码,只需要一行来获得你的匹配(我假设你可能想在多个地方做这个).

首先,您要编写一个函数来生成查找函数:

function findId(id:int):Function {
  return function( element : *, index : int, array : Array ) : Boolean
  {
    return element.id == id;
  }
}
Run Code Online (Sandbox Code Playgroud)

然后我会写一个函数来返回第一个匹配,这样你就不必复制这两行:

function findInCollection(c:ArrayCollection, find:Function):Object {
  var matches : Array = c.source.filter( find );
  return ( matches.length > 0 ? matches[0] : null );
}
Run Code Online (Sandbox Code Playgroud)

然后你就是这样做的:

var stuff:String = findInCollection(cmenu, findId(2)) as String;
Run Code Online (Sandbox Code Playgroud)

  • 哇,整齐地使用那个功能工厂.我一直觉得必须有一种方法来定制回调例程; 这真的很优雅. (2认同)

Ama*_*osh 3

不,你不能。struct.mi.(@id == "2").@stuff是 E4X,它是 ECMA Script for XML 的缩写。您不能在其他 AS 对象上使用 e4x。

  • 为什么不提供帮助,并实际向用户展示正确的方法,而不是简单地告诉他们“不,你不能”? (8认同)