Apache flex 检查对象是否为空的步骤

Apache flex 检查对象是否为空的步骤,apache-flex,actionscript-3,actionscript,collections,flex3,Apache Flex,Actionscript 3,Actionscript,Collections,Flex3,我想在函数中检查传递的object类型参数是否为空。有时它是空的,但仍然不是空的,因此我不能依赖空条件。我可以在这里使用flex对象的一些属性,如“长度”/“大小”。 请帮忙。 提前感谢。如果您的意思是如果对象没有属性: var isEmpty:Boolean = true; for (var n in obj) { isEmpty = false; break; } 这是一些严重的黑客行为,但您可以使用: Object.prototype.isEmpty = function():Boole

我想在函数中检查传递的object类型参数是否为空。有时它是空的,但仍然不是空的,因此我不能依赖空条件。我可以在这里使用flex对象的一些属性,如“长度”/“大小”。 请帮忙。
提前感谢。

如果您的意思是如果对象没有属性:

var isEmpty:Boolean = true;
for (var n in obj) { isEmpty = false; break; }

这是一些严重的黑客行为,但您可以使用:

Object.prototype.isEmpty = function():Boolean {
    for(var i in this)
        if(i != "isEmpty")
            return false
    return true
}

var p = {};
trace(p.isEmpty()); // true
var p2 = {a:1}
trace(p2.isEmpty()); // false

取决于你的目标是什么,或者更确切地说,取决于你期望它有什么。例如,如果您的对象应该包含您正在查找的名为name的属性,您可以这样做

if(objSomeItem == null || objSomeItem.name == null || objSomeItem.name.length == 0)
{
 trace("object is empty");
}
或者如果你的对象实际上应该是其他东西,比如你可以做的数组

var arySomeItems = objSomeItem as Array;
if(objSomeItem == null || arySomeItems == null || arySomeItems.length == 0)
{
  trace("object is empty");
}
您还可以通过反射使用其他方法,例如ObjectUtil.getClassInfo,然后通过属性枚举以检查设置值。。。。本课程帮助:

import flash.utils.describeType;
import flash.utils.getDefinitionByName;

public class ReflectionUtils 
{
    /** Returns an Array of All Properties of the supplied object */
    public static function GetVariableNames(objItem:Object):Array
    {
        var xmlPropsList:XMLList = describeType(objItem)..variable;
        var aryVariables:Array = new Array();
        if (xmlPropsList != null)
        {
            for (var i:int; i < xmlPropsList.length(); i++)
            {
                aryVariables.push(xmlPropsList[i].@name);
            }
        }

        return aryVariables;
    }

    /** Returns the Strongly Typed class of the specified library item */
    public static function GetClassByName($sLinkageName:String):Class
    {
        var tObject:Class = getDefinitionByName($sLinkageName) as Class;
        return tObject;
    }

    /** Constructs an instance of the speicified library item */
    public static function ConstructClassByName($sLinkageName:String):Object
    {
        var tObject:Class = GetClassByName($sLinkageName);
        //trace("Found Class: " + tMCDefinition);
        var objItem:* = new tObject();
        return objItem;
    }

    public static function DumpObject(sItemName:String, objItem:Object):void
    {
        trace("*********** Object Dump: " + sItemName + " ***************");
        for (var sKey:String in objItem)
        {
            trace("    " + sKey +": " + objItem[sKey]);
        }
    }
    //}
}
import flash.utils.descripeType;
导入flash.utils.getDefinitionByName;
公共类反射单元
{
/**返回所提供对象的所有属性的数组*/
公共静态函数GetVariableNames(objItem:Object):数组
{
变量xmlPropsList:XMLList=describeType(objItem)…变量;
变量:数组=新数组();
if(xmlPropsList!=null)
{
for(var i:int;i

另一件需要注意的事情是,您可以使用一个简单的for循环来检查对象属性,这就是dumpobject函数所做的。

可以使用hasProperty方法来检查长度

var i:int = myObject.hasProperty("length") ? myObject.length: 0;
您也可以尝试:

ObjectUtil.getClassInfo(obj).properties.length > 0

它的好处是getClassInfo为您提供了有关对象的更多信息,例如,您可以获得对象中所有属性的名称,这可能会很方便。

如果对象包含一些“文本”,但as3无法将其识别为字符串,请将其转换为字符串并检查其是否为空

var checkObject:String = myObject;

if(checkObject == '')
{
  trace('object is empty');
}

您可以按如下方式直接检查:

var obj:Object = new Object();
if(obj == null)
{
//Do something
}

我从一个关于JS的类似问题中窃取了这个。它需要FP 11+或JSON.as库

function isEmptyObject(obj){
    return JSON.stringify(obj) === '{}';
}

谢谢你的帮助,它真的很有用,但是我们还是不能有一些内置的方法,比如:“myObj.length”/'myObj.isEmpty'再次感谢。你必须扩展
对象
类或
字典
类才能得到一个“内置”的方法:)有monkeypatching,但这会中断为。。在循环中,这。。。好。。。你知道。@Bob:
ObjectUtils
不是一个标准的API,但它比修补
Object
要好。实际上,有一个顶级函数(将
package foo{public function bar(){…}}
放在文件
foo/bar.as
)是可能的,从风格上讲,我更喜欢
FooUtils
类。@Bob:ah,我在找ObjectUtils.wow,这是一个有趣的技巧。你刚刚派我去了解原型会员。我不知道如何使用它,但这是一个有趣的胆量。我尽量避免使用原型,因为flex编译器会抱怨很多。我必须承认我是一个自动完成成瘾者…可能使用
this.hasOwnProperty(I)
检查其他原型成员的情况。我用集合重新标记了你的问题。你的问题有点模糊,也许你可以把它弄清楚以得到更多/更好的答案。是否将对象实例用作关联数组?如果需要计数,可以使用Array类。如果你能更好地描述上下文,回答起来就会更容易。如果你使用关联数组,你得到的东西和对象完全一样。长度属性将始终返回0,无论如何填充键。我的意思是不使用和关联数组,而是将代码更改为使用普通数组。关联数组表示您知道存储了哪些值,因此通常不需要对这些值进行计数。但是没有更多的细节很难说。他的问题是动态对象上没有长度字段。我读到的方式是,他不知道是否有长度属性。