通过[String] [String]访问嵌套数组/对象

时间:2016-12-13 12:32:10

标签: arrays string haxe openfl

在AS3中,我可以按如下方式访问嵌套数组/对象:

var platformObj:Object = {"filters": {"manufacturer": ["Adobe Windows"]};
trace(platformObj["filters"]["manufacturer"]); //trace output: "Adobe Windows";

Haxe中的错误:String应该是Int(对于第二个参数):
    platformObj [ “过滤器”]的 [ “制造商”]

如何在Haxe / OpenFL中执行此操作?

2 个答案:

答案 0 :(得分:2)

openfl.utils.Object基本上只是Dynamictypedef,因此以下工作正常:

trace(platformObj.filters.manufacturer); // [trace] Main.hx:6: [Adobe Windows]

如果您需要使用String来访问这些字段,您可以使用type check执行以下操作:

trace((platformObj["filters"] : Object)["manufacturer"]);

在幕后,所有这些只是reflection

trace(Reflect.field(Reflect.field(platformObj, "filters"), "manufacturer"));

答案 1 :(得分:2)

你可以使用点符号:

var platformObj = {filters: {manufacturer: ["Adobe Windows"]}};
// the type of platformObj is `{filters:{manufacturer:Array<String>}}` in this case
trace(platformObj.filters.manufacturer);

或者您可以使用StringMap

var platformObj = ["filters" => ["manufacturer" => ["Adobe Windows"]]];
// the type of platformObj is `Map<String, Map<String, Array<String>>>` in this case
trace(platformObj["filters"]["manufacturer"]);

Haxe没有Object,但有Dynamic。您可以使用Reflect检索其字段:

var platformObj:Dynamic = {filters: {manufacturer: ["Adobe Windows"]}};
var filters = Reflect.field(platformObj, "filters");
var manufacturer = Reflect.field(filters , "manufacturer");
trace(manufacturer);

当您使用Haxe 3.3+时,您可以使用Any代替Dynamic

前两个使用起来更安全。使用动态/反射的最后一个可能有副作用。