AS3:检查一个字典是否为空

10

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

文档在这一点上并没有提供太多帮助。有没有一种简单明了的方法来做到这一点?如果没有,有没有一种丑陋但不太脆弱的方法来做到这一点?

5个回答

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
这似乎是解决不良做法的方案。从字典中删除一个条目应该同时删除键和值。如果出于某种原因,我想删除值但保留键,则该字典并不真正为空——它还有一些(显然是有意义的)键。 - Dan Homerick
好的。如果你移除(obj != null)这个语句,那么它就能工作了,但我猜其他的答案也能行... - Reuben
2
其实,将上述使用for...in的方法与这个方法结合起来不是更好吗?for...in方法可以告诉你是否有任何键,这很重要。如果您有一个空值键,则此方法可能会失败。 - scriptocalypse

6
唯一想到的方法是遍历所有键并计数,如下所示:
var count:int = 0;

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

相当无聊 - 但我认为这就是你所剩下的。请注意,Dictionary只是一个非常非常非常薄的包装器,用于普通对象。

2

还有OP提到的空/非空特殊情况:

var empty:Boolean = true;

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

这样的代码应该放在一个实用函数中,而不是到处复制它,这样在使用时就可以清楚地知道正在发生什么。


1
另一种方法是添加一个字典项dict["count"],每次向字典中添加一个项目时递增,每次删除一个项目时递减。或者更复杂的解决方案是子类化Dictionary,并添加push、pop和length属性,这些属性基本上做相同的事情。

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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接