对象是否有“孩子”

时间:2010-01-07 11:13:05

标签: flex actionscript-3

我只是想知道相关的对象是否有任何子对象。 我真的必须这样做:

public static function getLength(o:Object):bool
{
  for (var item:* in o)
    if (item != "mx_internal_uid")
        return true;
  return false;
}

有没有办法说SOMETHING LIKE:Object.hasChildren(); 或者甚至是Object.childCount();

有问题的对象不会扩展DisplayObjectContainer。它就像是:

var Ob:Object;
Ob.SomeProp="xxx";
Ob.SomeOtherProp="zzz";

我怎么知道对象中有多少“条目”。 (在这种情况下为2)。

换句话说,“for(var item:* in Ob)”如何知道何时停止。 ???

3 个答案:

答案 0 :(得分:5)

检查对象的一个​​好方法是在 ObjectUtil 中构建的flex。我认为你想要实现的目标是通过使用( obj 是要分析的对象)来完成的:

  

ObjectUtil.getClassInfo(OBJ).properties.length

但是 ObjectUtil.getClassInfo 如果您正在尝试分析对象,那么它也是一个好地方,它会返回大量信息(详情请参阅{{ 3}})。

它还具有检查变量是否简单的功能 - ObjectUtil.isSimple

答案 1 :(得分:0)

对象你指的是Object类,因此计算属性,或者对displaylist上的对象,如果是后者,对象肯定会扩展DisplayObjectContainer,它具有numChildren属性

答案 2 :(得分:0)

正如kajyr所说,如果它是一个DisplayObjectContainer,你可以检查numChildren。

如果要检查通用对象是否包含简单属性(基元,如Number,int,uint,String,Boolean)或复杂属性(subObjects,某些类的实例),您可能将其视为该通用对象的子项,你做了以下事情:

var testObj:Object = {id:1,name:'DumDum'};
var testObj2:Object = {id:2,name:'NumNum',data:[1,2,3,4,5,6,7,8,9],somethingComplex:{firstName:'Num',lastName:'Num'}};

trace(isSimple(testObj).length == 0);//prints true
trace(isSimple(testObj2).length == 0);//prints false
trace(isSimple(testObj2));

function isSimple(obj:*):Array{
    var complex:Array = [];
    for(var prop in obj){
        if(!(obj[prop] is String || obj[prop] is int || obj[prop] is uint || obj[prop] is Number  || obj[prop] is Boolean)) 
            complex.push({prop: obj[prop]});
    }
    return complex;
}

如果你想获得成员数量(与对象相关的变量),这很容易得到:

var Ob:Object = {};
Ob.SomeProp="xxx";
Ob.SomeOtherProp="zzz";

trace(getMembersNum(Ob));//prints 2

function getMembersNum(obj:*):int{
    var result:int = 0;
    for(var prop in obj) result++;
    return result;
}

你可以在你的实用程序包/类中写这个:或者像这样:

public static function get numMembers(obj:*):int{
    var result:int = 0;
    for(var prop in obj) result++;
    return result;
}

HTH