English 中文(简体)
我该如何在Actionscript中获取对象中属性列表?
原标题:
  • 时间:2008-12-16 19:05:07
  •  标签:

我有一个数据提供程序和一个筛选函数,它们都分配给我的数据提供程序的数组。

当dataprovider (item.data) 传递到filterfunction时,我如何获取每行属性列表?

例如,如果我的物件包含:

  • Object
    • name
    • email
    • address

然后我希望在我的过滤函数中能够查看姓名、电邮和地址。不幸的是,我事先不知道这些属性将是什么。

有什么想法吗?

最佳回答

如果它是一个动态对象,我相信你可以这样做:

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

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

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

这是在AS2中的操作方式,我相信在AS3中对于动态对象仍然有效。我认为它所显示的属性对于非动态对象更为有限。

问题回答

flash.utils.describeType(value:*)也会给你提供一个对象上的属性列表。

for-in 只适用于动态对象。对于类型化的对象,您需要使用某种反射来获取属性名称(例如 http://www.as3commons.org/as3-commons-reflect/index.html)。

安德烈。

你可能在寻找

ObjectUtil.getClassInfo(object) 

看:

将此翻译成中文:http://livedocs.adobe.com/flex/3/langref/mx/utils/ObjectUtil.html#getClassInfo%28%29 http://livedocs.adobe.com/flex/3/langref/mx/utils/ObjectUtil.html#getClassInfo()

Be aware that there is a bug in it which causes it to treat XML as a non-dynamic data type. More on the bug in: bugs.adobe.com/jira/browse/SDK-17712

对我有用的只有这个:

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

你可以得到类似于这样的东西:

obj = m:email@ra..., r:true
// 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;
}

您可以使用 for..in 循环获取属性名称,或使用 for each..in 循环获取属性值...


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

This also will help you..
1. for Loop - Will work based on index
2. for each - recursive call upto the length
3. for in - used to read the property values

     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
     }




相关问题
热门标签