web-dev-qa-db-fra.com

Comment obtenir la liste des propriétés d'un objet dans Actionscript?

J'ai un fournisseur de données et une fonction de filtrage pour ma baie assignée à mon fournisseur de données.

Comment puis-je obtenir une liste des propriétés qui se trouvent dans chaque ligne du fournisseur de données (item.data) lors de sa transmission à la fonction de filtrage?

Par exemple, si mon objet contenait:

  • Objet
    • nom
    • email
    • adresse

Ensuite, je voudrais, dans ma fonction de filtrage, pouvoir regarder le nom, l'e-mail et l'adresse. Malheureusement, je ne sais pas quelles seront ces propriétés à l'avance.

Des idées?

30
GeoffreyF67

Si c'est un objet dynamique, je pense que vous pouvez simplement faire quelque chose comme ça:

var obj:Object; // I'm assuming this is your object

for(var id:String in obj) {
  var value:Object = obj[id];

  trace(id + " = " + value);
}

C'est ainsi que cela se fait dans AS2, et je crois que cela fonctionne toujours pour les objets dynamiques dans AS3. Je pense que les propriétés qu'il montrera sont plus limitées sur les objets non dynamiques.

53
Herms

flash.utils.describeType(value:*) vous donnera également une liste de propriétés sur un objet.

10
Joel Hooks

Vous cherchez probablement

ObjectUtil.getClassInfo(object) 

,voir:

http://livedocs.Adobe.com/flex/3/langref/mx/utils/ObjectUtil.html#getClassInfo%28%29

Sachez qu'il contient un bogue qui le fait traiter XML comme un type de données non dynamique. Plus d'informations sur le bug dans: bugs.Adobe.com/jira/browse/SDK-17712

7
Robert Bak

for-in fonctionne uniquement pour les objets dynamiques. Pour les objets typés, vous devez utiliser une sorte de réflexion pour obtenir les noms de propriété (par exemple http://www.as3commons.org/as3-commons-reflect/index.html )

/ Andrei.

6
Andrei Kouzmenkov

pour moi n'a été utile que ceci:

trace('obj = '+getProperties(obj));

        public static function getProperties(obj:*):String  {
            var p:*;
            var res:String = '';
            var val:String;
            var prop:String;
            for (p in obj) {
                prop = String(p);
                if (prop && prop!=='' && prop!==' ') {
                    val = String(obj[p]);
                    if (val.length>10) val = val.substr(0,10)+'...';
                    res += prop+':'+val+', ';
                }
            }
            res = res.substr(0, res.length-2);
            return res;
        }

et vous obtenez quelque chose comme ça:

obj = m:email@ra..., r:true
3
Billion
// this method will work for retrieving properties of a *non-dynamic* (typed) object

// @return - all object properties
public function getProperties(_obj : *) : Array
{
        var _description : XML = describeType(_obj);
        var _properties : Array = new Array();
        for each (var prop:XML in _description.accessor)
        {
                var _property : Object = new Object();
                _property.name = String(prop.@name);
                _property.type = String(simple_type(prop.@type));
                _property.access = String(prop.@access);
                _property.declaredBy = String(prop.@declaredBy);
                try
                {
                   _property.value = _obj[_property.name];
                }
                catch (e : Error)
                {
                   _property.value = "";
                }
                _properties.Push(_property)
        }
        _properties.sortOn("name");
        return _properties;
}

// better format for object class information
private function simple_type(_type : String) : String
{
        var lastIndex : int = _type.lastIndexOf("::");
        _type = lastIndex > 0 ? _type.substr(lastIndex + 2) : _type;
        return _type;
}
2

Cela vous aidera également ..
1. for Loop - Fonctionnera en fonction de l'index
2. pour chaque - appel récursif jusqu'à la longueur
3. for in - utilisé pour lire les valeurs des propriétés

     for( var obj : String in objectData ) //here objectData is your object
     {
        trace( "Object Name Is : " + obj );
        var data : Object = objectData[obj]; //here we get the object value by using the property name
        trace( "Value Is : " + data ); //Converts object to string
     }
1
Gopinath Ravichandran

vous pouvez utiliser un for .. in loop pour obtenir les noms des propriétés, ou un for each .. in loop pour obtenir les valeurs des propriétés ...


for( var o : * in object){
    trace( o + " = " + object[o] );
}
/************* OR ******************/
for each( var o : * in object ){
    trace( "object has property: " + o );
}
1
ForYourOwnGood