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