2009-10-26 20 views
6

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

+0

He resuelto su pregunta con las colecciones. Tu pregunta es un poco vaga, quizás puedas aclararla para obtener más/mejores respuestas. ¿Está utilizando una instancia de objeto como una matriz asociativa? Si necesita un conteo, quizás use la clase Array. Si describes el contexto un poco mejor, será más fácil responder. –

+0

Si usa una matriz asociativa, obtiene exactamente lo mismo que un objeto. La propiedad de longitud siempre devolverá 0 sin importar cómo se completen las claves. – sharvey

+0

Me refiero a no usar una matriz asociativa, sino cambiar el código para usar una matriz normal. Una matriz asociativa indica que usted sabe qué valores están almacenados y, por lo tanto, normalmente no necesitará contarlos. Pero es difícil de decir sin más detalles. –

Respuesta

15

Si se refiere a si un objeto no tiene propiedades:

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

Gracias por la ayuda, fue realmente útil, pero todavía no podemos tener algún método incorporado como: "myObj.length"/'myObj.isEmpty' Gracias de nuevo. – Ashine

+1

Vas a tener que extender la clase 'Object' o la clase' Dictionary' para obtener un método "incorporado" para eso :) – Amarghosh

+0

Hay parcheo, pero eso se rompe para ... en loops, que ... bueno ... . ya sabes. –

6

esto es algún artilugio grave, pero que puede utilizar:

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 
+0

wow, eso es un truco interesante. Me acabas de enviar en una misión para aprender sobre el prototipo de miembro. No estoy seguro de cómo podría usarlo, pero es un poco interesante saberlo. – JStriedl

+0

Intento evitar prototipos, porque el compilador flex se queja mucho. Y debo admitir que soy un adicto a la autocompletar ... – sharvey

+0

posiblemente verifique usando 'this.hasOwnProperty (i)', en el caso de otros miembros del prototipo. –

0

depende de lo que su objeto es, o más bien lo que espera es tener Por ejemplo, si se supone que el objeto de contener alguna propiedad llamada nombre que está buscando, es posible hacer

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

o si su objeto es en realidad supone que ser otra cosa, como una matriz que podría hacer

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

también es posible usar otras formas a través de la reflexión, como ObjectUtil.getClassInfo, a continuación, enumerar las propiedades para comprobar si hay valores establecidos .... esto ayuda clase:

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][email protected]); 
      } 
     } 

     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 puede usar un bucle for para verificar las propiedades de un objeto, eso es lo que está haciendo esta función dumpobject.

-1

puede utilizar utilizar el método hasProperty para comprobar la longitud

var i:int = myObject.hasProperty("length") ? myObject.length: 0; 
+0

Su problema es que no hay un campo de longitud en los objetos dinámicos. – sharvey

+0

La forma en que lo leo es que no sabía si había una propiedad de longitud o no. – AndrewB

5

También puede probar:

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

Lo bueno de esto es que GetClassInfo le da mucha más información sobre el objeto, p.ej. obtienes los nombres de todas las propiedades en el objeto, que pueden ser útiles.

+0

Gracias U :) Redujo mi esfuerzo ... – Prax

2

Si el objeto contiene algo de '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'); 
} 
0

Usted puede comprobar directamente como seguimiento,

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

Robé esto desde una pregunta similar en relación con JS. Requiere FP 11+ o una biblioteca JSON.as.

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