Para verificar se um objeto é vazio ou não
-
06-07-2019 - |
Pergunta
Eu quero verificar na minha função se um argumento passado do tipo de objeto está vazio ou não. Às vezes é vazia, mas ainda não nulo, portanto, eu não posso confiar na condição nula. Existe alguma propriedade como 'length' / 'tamanho' para objetos Flex que eu posso usar aqui. Por favor ajude. Agradecemos antecipadamente.
Solução
Se você quer dizer se um objeto não tem propriedades:
var isEmpty:Boolean = true;
for (var n in obj) { isEmpty = false; break; }
Outras dicas
Este é algum hack grave, mas você pode usar:
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
Você também pode tentar:
ObjectUtil.getClassInfo(obj).properties.length > 0
A coisa boa sobre isso é que GetClassInfo lhe dá muito mais informações sobre o objeto, por exemplo. você obter os nomes de todas as propriedades no objeto, que pode vir a calhar.
Se o objeto contém alguns 'texto', mas as3 não reconhece-lo como um String, convertê-lo para string e verifique se ele está vazio.
var checkObject:String = myObject;
if(checkObject == '')
{
trace('object is empty');
}
Depende do que o seu objecto é, ou melhor, o que você espera que ele tem. Por exemplo, se o objeto deve conter alguma propriedade chamou o nome que você está procurando, você pode fazer
if(objSomeItem == null || objSomeItem.name == null || objSomeItem.name.length == 0)
{
trace("object is empty");
}
ou se o objeto é realmente suposto ser outra coisa, como um array que você poderia fazer
var arySomeItems = objSomeItem as Array;
if(objSomeItem == null || arySomeItems == null || arySomeItems.length == 0)
{
trace("object is empty");
}
Você também pode usar outras maneiras através da reflexão, como ObjectUtil.getClassInfo, em seguida, enumerar as propriedades para verificar se há valores definidos .... essa classe de ajuda:
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]);
}
}
//}
}
Outra coisa a notar é que você pode usar um loop for simples de verificar através de um propriedades de objetos, isso é o que esta função dumpobject está fazendo.
Você pode verificá-lo diretamente como segue,
var obj:Object = new Object();
if(obj == null)
{
//Do something
}
Eu roubei isto de uma pergunta semelhante relativo a JS. Ela exige FP 11+ ou uma biblioteca JSON.as.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
pode usar usar o método hasProperty para verificar comprimento
var i:int = myObject.hasProperty("length") ? myObject.length: 0;