AS3: проверьте, свободен ли словарь

Flash реализует словарь (то есть нечто вроде HashMap), используя два подхода. Один подход - это класс flash.utils.Dictionary, а другой - общий Object. Я хотел бы проверить, сколько пар key:value находится в словаре. В большинстве случаев я просто хотел бы знать, что существуют пары any key:value, то есть просто проверьте, не пуст ли он.

Документация не помогла в этом вопросе. Есть ли простой и понятный способ сделать это? В противном случае, есть ли уродливый, но не слишком хрупкий способ сделать это?

Ответ 1

Единственный способ, который приходит на ум - перебирать все ключи и считать их так:

var count:int = 0;

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

Довольно хромой - но я думаю, что это то, с чем вы остались. Обратите внимание, что словарь - это действительно действительно тонкая оболочка для Vanilla Object.

Ответ 2

Это достоверно скажет вам, является ли конкретный словарь пустым:

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], вы должны быть в порядке, хотя).

Ответ 3

И пустой/не пустой специальный случай, упомянутый OP:

var empty:Boolean = true;

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

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

Ответ 4

Другой подход заключается в добавлении словаря entry dict [ "count" ], который повторяется каждый раз, когда вы добавляете элемент в словарь, и повторяется каждый раз при удалении элемента. Или более сложное решение будет подклассифицировать словарь и добавить свойство push, pop и length, которое делает в основном то же самое.

Ответ 5

Протестировано и работает.
Ясность улучшилась, избегая отрицательного языка.

/**
 * @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;
}