2008-12-16 18 views
30

Tôi có một dataprovider và một chức năng lọc cho mảng của tôi được gán cho dataprovider của tôi.Làm cách nào để có danh sách thuộc tính trong đối tượng trong Actionscript?

Làm cách nào tôi có thể nhận danh sách các thuộc tính nằm trong mỗi hàng của dataprovider (item.data) khi nó được chuyển đến hàm bộ lọc?

Ví dụ, nếu đối tượng của tôi chứa:

  • Object
    • tên
    • email
    • địa chỉ

Sau đó, tôi muốn, trong filterfunction của tôi được có thể xem tên, email và địa chỉ. Thật không may, tôi không biết những gì các tài sản này sẽ được trước khi tay.

Bất kỳ ý tưởng nào?

Trả lời

52

Nếu đó là một đối tượng năng động, tôi tin rằng bạn chỉ có thể làm một cái gì đó như thế này:

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

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

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

Đó là cách nó được thực hiện trong AS2, và tôi tin rằng vẫn hoạt động cho các đối tượng năng động trong AS3. Tôi nghĩ rằng các thuộc tính mà nó sẽ hiển thị bị hạn chế hơn đối với các đối tượng không động.

+1

Perfect! Hoạt động tuyệt vời. Đã cố gắng tìm ra điều đó trong nhiều ngày. Cảm ơn rất nhiều! G-Man – GeoffreyF67

+0

+1 Ngay cả khi AS3 không có eval nữa, một điều như thế này làm cho nó hoạt động. – zawhtut

+1

"Tôi nghĩ rằng các thuộc tính mà nó sẽ hiển thị bị hạn chế hơn đối với các đối tượng không động." <- Có vẻ như bạn đúng về điều này, có vẻ như một vòng lặp 'for' sẽ không đi qua các thuộc tính được định nghĩa tĩnh của một lớp. – CamilB

1

bạn có thể sử dụng cho .. trong vòng lặp để có được các tên tài sản, hoặc cho mỗi .. trong vòng lặp để có được giá trị tài sản ...


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

cho-in tác phẩm cho các đối tượng năng động chỉ . Đối với các đối tượng đã nhập, bạn cần phải sử dụng một số loại phản ánh để có được tên thuộc tính (ví dụ: http://www.as3commons.org/as3-commons-reflect/index.html)

/Andrei.

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

đơn giản được khai báo như thế nào? – Dave

+1

có bạn đã đúng! hãy kiểm tra chỉnh sửa của tôi –

2

đối với tôi là chỉ có ích này:

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

và bạn sẽ có được một cái gì đó như thế này:

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

Điều này làm việc cho tôi. Tôi đã deserializing một JSON từ api web của tôi trong một Object và các phương pháp khác được liệt kê ở đây đã không làm việc (tôi đã thử tất cả những người khác). Cảm ơn! –

1

Điều này cũng sẽ giúp bạn ..
1.cho Loop - sẽ làm việc dựa trên chỉ số
2. cho mỗi - gọi đệ quy tối đa chiều dài
3. tại - được sử dụng để đọc các tài sản giá trị

 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 
    }