Расчет длины словаря в Flex

Как лучше всего рассчитать длину объекта Dictionary в Flex?

var d:Dictionary = new Dictionary();
d["a"] = "alpha";
d["b"] = "beta";

Я хочу проверить длину, которая должна быть 2 для этого словаря. Есть ли другой способ сделать это, кроме как перебирать объекты?


person calvinf    schedule 01.04.2009    source источник


Ответы (6)


Нет, нет никакого способа проверить длину объекта (Dictionary - это в значительной степени объект, который поддерживает ключи, отличные от String), кроме как перебирать элементы.

http://www.flexer.info/2008/07/31/how-to-find-an-objects-length/

Вам, вероятно, не нужно беспокоиться о том, чтобы проверить, является ли свойство внутренним.

person CookieOfFortune    schedule 01.04.2009
comment
Вот код для цикла, который никто другой не предоставил: '[общедоступная статическая функция getLen (d: Dictionary): int {var i: int = 0; for (ключ var: объект в d) {i ++; } return i; }] - person Donal Tobin; 17.08.2009

В as3corelib есть служебная функция, которая может получить ключи в словаре. Вы можете проверить DicitonaryUtil.

Метод такой:

    public static function getKeys(d:Dictionary):Array
    {
        var a:Array = new Array();

        for (var key:Object in d)
        {
            a.push(key);
        }

        return a;
    }

Итак, вы бы сделали getKeys (dictionary) .length

person marketer    schedule 04.04.2009
comment
Это фактически создает массив и добавляет к нему каждый элемент, поэтому это очень дорого (по памяти и времени). - person Donal Tobin; 17.08.2009

Вместо этого вы можете использовать ассоциативные массивы, потому что я не думаю, что можно проверить длину объекта Dictionary. Однако вы можете расширить класс Dictionary и добавить эту функциональность и переопределить соответствующие методы.

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

var d:Dictionary = new Dictionary();
d["hi"] = "you"
d["a"] = "b"
for (var obj:Object in d) {
  trace(obj);
}
// Prints "hi" and "a"

Информацию об использовании "setPropertyIsEnumerable", но я считаю, что это более полезно для объектов, чем для Dictionary.

person nevets1219    schedule 01.04.2009

Вы можете написать класс вокруг словаря, который управляет вставкой / удалением, чтобы вы могли отслеживать количество ключей.

Попробуйте расширить прокси или просто сделайте обертку.

person tousdan    schedule 02.04.2009

Для всех, кто сталкивается с этим сейчас, есть обновление для DictionaryUtil. Теперь вы можете просто позвонить ..

var count:int = DictionaryUtil.getKeyCount(myDictionary);
person Craig    schedule 21.07.2010
comment
У вас есть информация о том, когда это стало доступно, или ссылка на документацию? Информации об этом не так много. - person calvinf; 22.07.2010
comment
Нет, не знаю. Я знаю, что он доступен в Flex 3.5 и в 4, возможно, даже еще в 3. Я просто искал этот ответ, и кто-то здесь упомянул DictionaryUtil, поэтому я сделал автозаполнение функций, доступных в нем, и наткнулся на это. - person Craig; 23.07.2010
comment
Я использую Flex 4 и не могу получить этот API. Но в библиотеке Flit есть DictionaryUtil.getItemCount. Код . google.com/p/flit/source/browse/trunk/flit/src/obecto/ - person Rudy; 09.01.2012

Вы можете получить keys из Dictionary и проверить length из keys array, как показано ниже:

var d:Dictionary = new Dictionary();
d["a"] = "alpha";
d["b"] = "beta";
var count:int = DictionaryUtil.getKeys(d).length;
person gbdcool    schedule 23.02.2017