Как я могу получить список свойств объекта в Actionscript?

У меня есть поставщик данных и функция фильтра для моего массива, назначенная моему поставщику данных.

Как я могу получить список свойств, которые есть в каждой строке поставщика данных (item.data), когда он передается в функцию фильтра?

Например, если мой объект содержал:

  • объект
    • имя
    • электронное письмо
    • адрес

Тогда я бы хотел, чтобы в моей функции фильтра можно было просматривать имя, адрес электронной почты и адрес. К сожалению, я не знаю, что эти свойства будут иметь под рукой.

Любые идеи?

16.12.2008 19:05:07
8 ОТВЕТОВ
РЕШЕНИЕ

Если это динамический объект, я думаю, вы можете сделать что-то вроде этого:

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. Я думаю, что свойства, которые он покажет, более ограничены на не динамических объектах.

55
16.12.2008 19:40:36
Отлично! Работает отлично. Я пытался понять это в течение нескольких дней. Огромное спасибо! G-Man
GeoffreyF67 16.12.2008 20:16:48
+1 Даже у AS3 больше нет eval, такие вещи делают его динамичным.
zawhtut 29.01.2011 04:30:13
«Я думаю, что свойства, которые он покажет, более ограничены для нединамических объектов». <- Похоже, вы правы в этом, похоже, что такой forцикл не пройдет статически определенные свойства класса.
CamilB 12.11.2012 12:39:36

Вы можете использовать цикл for .. in, чтобы получить имена свойств, или a для каждого .. in цикла, чтобы получить значения свойств ...


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

for-in работает только для динамических объектов. Для типизированных объектов вам нужно использовать какое-то отражение для получения имен свойств (например, http://www.as3commons.org/as3-commons-reflect/index.html ).

/ Андрей.

6
17.07.2009 14:08:43

Вы, вероятно, ищете

ObjectUtil.getClassInfo(object) 

,видеть:

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

Имейте в виду, что в нем есть ошибка, которая заставляет его рассматривать XML как нединамический тип данных. Подробнее об ошибке в: bugs.adobe.com/jira/browse/SDK-17712

7
29.10.2009 07:28:29

flash.utils.describeType(value:*) также даст вам список свойств объекта.

10
2.04.2015 01:43:16
// 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
25.03.2014 13:26:34
как объявляется simple_type?
Dave 25.03.2014 06:57:39

для меня было полезно только это:

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
4
22.09.2012 13:51:47
Этот работал для меня. Я десериализовал JSON из моего веб-API в объекте, и другие методы, перечисленные здесь, не работали (я попробовал все остальные). Спасибо!
Felypp Oliveira 12.06.2013 12:38:25

Это также поможет вам.
1. для цикла - будет работать на основе индекса
2. для каждого - рекурсивный вызов до длины
3. для - используется для чтения значений свойств

     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
28.03.2017 05:10:40