2008-12-16 7 views
30

Ich habe einen Datenprovider und eine Filterfunktion für mein Array, das meinem Datenprovider zugewiesen ist.Wie kann ich eine Liste von Eigenschaften in einem Objekt in Actionscript bekommen?

Wie kann ich eine Liste der Eigenschaften erhalten, die sich in jeder Zeile des Datenproviders (item.data) befinden, wenn sie an die Filterfunktion übergeben wird?

Zum Beispiel, wenn mein Objekt enthält:

  • Objekt
    • Namen
    • E-Mail
    • Adresse

Dann würde ich in meiner Filterfunktion will sein in der Lage, Name, E-Mail und Adresse zu sehen. Leider weiß ich nicht, was diese Eigenschaften vor hand haben werden.

Irgendwelche Ideen?

Antwort

52

Wenn es ein dynamisches Objekt, das ich glaube, Sie können so etwas wie dies gerade tun:

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

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

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

Das ist, wie es in AS2 getan hat, und ich glaube, dass für dynamische Objekte in AS3 arbeitet noch. Ich denke, dass die Eigenschaften, die es zeigen wird, bei nicht dynamischen Objekten begrenzter sind.

+1

Perfekt zu lesen! Funktioniert super. Ich habe versucht, das tagelang herauszufinden. Vielen Dank! G-Man – GeoffreyF67

+0

+1 Sogar AS3 hat keine Eval mehr, so etwas macht es dynamisch. – zawhtut

+1

"Ich denke, dass die Eigenschaften, die gezeigt werden, bei nicht dynamischen Objekten begrenzter sind." <- Sieht so aus, als ob Sie damit recht haben, es scheint so, als würde eine solche "for" -Schleife nicht die statisch definierten Eigenschaften einer Klasse durchlaufen. – CamilB

1

können Sie für .. in-Schleife verwenden, um die Eigenschaften Namen zu erhalten, oder ein jeder für .. in Schleife die Eigenschaftswerte zu erhalten ...


for(var o : * in object){ 
    trace(o + " = " + object[o]); 
} 
/************* OR ******************/ 
for each(var o : * in object){ 
    trace("object has property: " + o); 
} 
2
// 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([email protected]); 
       _property.type = String(simple_type([email protected])); 
       _property.access = String([email protected]); 
       _property.declaredBy = String([email protected]); 
       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; 
} 
+1

Wie wird Simple_type deklariert? – Dave

+1

ja du hast Recht! Bitte überprüfen Sie meine Bearbeitung –

2

war für mich nur sinnvoll, diese:

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; 
     } 

und Sie so etwas wie dieses:

obj = m:[email protected], r:true 
+0

Dieser arbeitete für mich. Ich habe einen JSON aus meiner Web API in einem Objekt deserialisiert und die anderen hier aufgelisteten Methoden haben nicht funktioniert (ich habe alle anderen ausprobiert). Vielen Dank! –

1

Dies wird Ihnen auch helfen ..
1.für Loop - Wird auf Basis von Index arbeiten
2. für jeden - rekursiven Aufruf bis zu der Länge
3. für in - verwendet, um die Eigenschaft

Werte
 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 
    }