Apache flex 检查对象是否为空的步骤
我想在函数中检查传递的object类型参数是否为空。有时它是空的,但仍然不是空的,因此我不能依赖空条件。我可以在这里使用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
提前感谢。如果您的意思是如果对象没有属性:
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,无论如何填充键。我的意思是不使用和关联数组,而是将代码更改为使用普通数组。关联数组表示您知道存储了哪些值,因此通常不需要对这些值进行计数。但是没有更多的细节很难说。他的问题是动态对象上没有长度字段。我读到的方式是,他不知道是否有长度属性。