2009-10-26 2 views
6

Я хочу проверить свою функцию, если переданный аргумент объекта типа пуст или нет. Иногда он пуст, но все еще не равен нулю, поэтому я не могу полагаться на нулевое условие. Есть ли какое-либо свойство типа 'length'/'size' для объектов flex, которые я могу использовать здесь. Пожалуйста, помогите. Спасибо заранее.Чтобы проверить, пустой объект или нет

+0

Я передал ваш вопрос с коллекциями. У вас вопрос немного расплывчатый, возможно, вы можете его очистить, чтобы получить больше/лучших ответов. Используют экземпляр объекта как ассоциативный массив? Если вам нужен счет, возможно, вы вместо этого используете класс Array. Если вы описываете контекст немного лучше, вам будет легче ответить. –

+0

Если вы используете ассоциативный массив, вы получаете то же самое, что и объект. Свойство length всегда будет возвращать 0 независимо от того, как вы набираете ключи. – sharvey

+0

Я имел в виду не использовать ассоциативный массив, а изменять код для использования обычного массива. Ассоциативный массив указывает, что вы знаете, какие значения хранятся, и поэтому вам обычно не нужно подсчитывать. Но трудно сказать, не более подробно. –

ответ

15

Если вы имеете в виду, если объект не имеет свойства:

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

Спасибо за помощь, это было действительно полезно, но все же мы не можем иметь встроенный метод: «myObj.length»/'myObj.isEmpty' Еще раз спасибо. – Ashine

+1

Вам нужно расширить класс 'Object' или класс' Dictionary' для получения «встроенного» метода для этого: – Amarghosh

+0

Существует monkeypatching, но это ломается для .. в циклах, которые ... ну .. . вы знаете. –

6

Это некоторые серьезные хак, но вы можете использовать:

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

Вау, это интересный трюк. Вы только что отправили меня на поиски, чтобы узнать о члене прототипа. Не знаю, как я могу это использовать, но это интересная битка, о которой нужно знать. – JStriedl

+0

Я стараюсь избегать прототипов, потому что компилятор flex жалуется на многое. И я должен признать, что я являюсь автозавершением addict ... – sharvey

+0

возможно проверить с помощью 'this.hasOwnProperty (i)', в случае других элементов прототипа. –

0

Зависит от того, что ваш объект, или, вернее, то, что вы ожидаете это иметь. Например, если ваш объект должен содержать некоторое свойство, называемое имя, которое вы ищете, вы можете сделать

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

Еще одно замечание: вы можете использовать простой цикл для проверки свойств объектов, это то, что делает эта функция dumpobject.

-1

можно использовать использовать метод HasProperty для проверки длины

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

Его проблема в том, что на динамических объектах нет поля длины. – sharvey

+0

Как я читал, он не знал, есть ли свойство длины или нет. – AndrewB

5

Вы также можете попробовать:

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

Хорошая вещь об этом является то, что getClassInfo дает гораздо больше информации об объекте, например. вы получаете имена всех свойств объекта, которые могут пригодиться.

+0

Спасибо U :) Это уменьшило мои усилия ... – Prax

2

Если объект содержит некоторый «текст», но as3 не распознает его как строку, преобразует его в строку и проверяет, является ли он пустым.

var checkObject:String = myObject; 

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

Вы можете непосредственно проверить его как следует,

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

я украл из подобного вопроса, относящегося к JS. Для этого требуется библиотека FP 11+ или JSON.as.

function isEmptyObject(obj){ 
    return JSON.stringify(obj) === '{}'; 
} 
Смежные вопросы