2016-12-13 4 views
2

En AS3 je pouvais accéder à un tableau imbriqué/objet comme suit:accès Nested Array/objet via [chaîne] [chaîne]

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

erreurs dans Haxe avec: String doit être Int (pour le second argument) :
platformObj [ "filtres"] [ "fabricant"]

Comment puis-je faire dans Haxe/OpenFL?

Répondre

2

openfl.utils.Object est fondamentalement juste un typedef pour Dynamic, si les travaux suivants fin:

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

Si vous besoin d'utiliser un String pour accéder aux champs, vous pouvez effectuer les opérations suivantes en utilisant un type check:

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

Sous le capot, tout cela est juste reflection:

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

La troisième option était exactement ce que je cherchais, et me semble la plus logique, en fait j'étais sur le point de travailler sur ce point - Heureusement, j'ai demandé, c'est agréable de connaître les autres façons de le faire! –

2

Vous pouvez simplement utiliser la notation dot:

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

Ou vous pouvez utiliser 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 n'a pas Object, mais a Dynamic. Vous pouvez récupérer ses champs à l'aide Reflect:

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

Lorsque vous utilisez Haxe 3.3+ vous pouvez utiliser Any au lieu de Dynamic.

Les deux premiers sont plus sûrs à utiliser. Le dernier utilisant la dynamique/réflexion peut avoir des effets secondaires.

+0

Quelle est la différence entre l'utilisation d'un objet pour contenir les informations que j'ai mentionnées et Dynamic? Quelles limitations d'Object seraient levées si j'utilisais Dynamic? Merci pour la mention StringMap, quelque chose que je vais utiliser à l'avenir pour être * strict *. –

+0

Haxe lui-même n'a pas d'objet, mais a dynamique. –

+0

Oh ouais, oups, je travaille aussi avec OpenFL, donc j'utilise un mélange d'Haxe et d'OpenFL. –