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