Pregunta

Quiero verificar mi función si un argumento pasado de tipo objeto está vacío o no. A veces está vacío pero todavía no es nulo, por lo que no puedo confiar en la condición nula. ¿Hay alguna propiedad como 'longitud' / 'tamaño' para los objetos flexibles que puedo usar aquí? Por favor ayuda. Gracias de antemano.

¿Fue útil?

Solución

Si te refieres a si un objeto no tiene propiedades:

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

Otros consejos

Esto es un truco serio, pero puedes 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

También puedes probar:

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

Lo bueno de esto es que getClassInfo le brinda mucha más información sobre el objeto, por ejemplo. obtiene los nombres de todas las propiedades en el objeto, lo que puede ser útil.

Si el objeto contiene algún 'texto' pero as3 no lo reconoce como una Cadena, conviértalo en una cadena y verifique si está vacío.

var checkObject:String = myObject;

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

Depende de cuál sea su objeto, o más bien de lo que espera que tenga. Por ejemplo, si se supone que su objeto debe contener alguna propiedad llamada nombre que está buscando, podría hacerlo

if(objSomeItem == null || objSomeItem.name == null || objSomeItem.name.length == 0)
{
 trace("object is empty");
}

o si se supone que tu objeto es otra cosa, como una matriz que podrías hacer

var arySomeItems = objSomeItem as Array;
if(objSomeItem == null || arySomeItems == null || arySomeItems.length == 0)
{
  trace("object is empty");
}

También puede utilizar otras formas de reflexión, como ObjectUtil.getClassInfo, y luego enumerar las propiedades para verificar los valores establecidos ... esta clase ayuda:

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]);
        }
    }
    //}
}

Otra cosa a tener en cuenta es que puedes usar un simple bucle for para verificar las propiedades de los objetos, eso es lo que está haciendo esta función de dumpobject.

Puedes verificarlo directamente como sigue,

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

Robé esto de una pregunta similar relacionada con JS. Requiere FP 11+ o una biblioteca JSON.as.

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

puede usar el método hasProperty para verificar la longitud

var i:int = myObject.hasProperty("length") ? myObject.length: 0;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top