2009-10-13 87 views
10

Flash使用两种方法实现字典(即类似于HashMap的字典)。一种方法是flash.utils.Dictionary类,另一种是通用的Object。我想查看字典中有多少个key:value对。在大多数情况下,我只想知道它有任何key:value对,即只检查它是否为空。AS3:检查字典是否为空

这方面的文档没有太多的帮助。有没有简单明了的方法来做到这一点?如果没有,那么有没有一种丑陋但不太脆弱的方式来做到这一点?

回答

6

,想到的唯一办法是通过所有键进行迭代并计数 - 像这样:

var count:int = 0; 

for (var key:Object in dict) 
{ 
    count++; 
} 

漂亮跛 - 但我认为那是你还剩下什么。请注意,Dictionary对于vanilla Object来说只是一个真正非常薄的包装。

12

这将可靠地告诉你,如果一个特定的字典是空的:

function isEmptyDictionary(dict:Dictionary):Boolean 
{ 
    for each(var obj:Object in dict) 
    { 
     if(obj != null) 
     { 
      return false 
     } 
    } 
    return true; 
} 

请注意,你需要做的obj != null检查 - 即使你设置myDictionary[key] = null,它仍然会遍历一个空的对象,所以在这种情况下,常规的for...in循环将不起作用。 (如果你总是使用delete myDictionary[key],你应该没问题)。

+4

这似乎是一个不良做法的解决方案。从字典中删除条目应删除键和值。如果由于某种原因,我想删除这个值,但是离开这个键,那么这个字典就不是真的空 - 它有一些(显然是有意义的)键。 – 2009-10-14 17:32:39

+0

够公平的。如果你删除(obj!= null)语句,那么这将起作用,但我猜测其他答案也会起作用... – Reuben 2009-10-14 20:27:18

+2

其实,最好不要将上述方法结合使用...与这一个? for ... in方法告诉你是否有任何键,这很重要。如果您的键值为空,则此方法可能会失败。 – scriptocalypse 2011-04-19 19:28:34

1

另一种方法是添加一个词典条目dict [“count”],每次将项目添加到字典时迭代,并在每次删除项目时进行迭代。或者更复杂的解决方案将继承Dictionary,并添加push,pop和长度属性,这些属性的功能基本相同。

2

而且由OP提到的空/空特例:

var empty:Boolean = true; 

for (var key:Object in dict) 
{ 
    empty = false; 
    break; 
} 

这样的代码在一个效用函数应该去复制它所有的地方,而不是因此在使用的时候它会明显发生了什么事情。

0

测试和工作。
通过避免负面语言提高了清晰度。

/** 
* @return Whether given Dictionary has content or is empty. 
*/ 
public function hasContent(dictionary:Dictionary):Boolean 
{ 
    for (var anything:Object in dictionary) 
     return true; 
    return false; 
}