Изчисляване на дължината на речника във Flex

Кой е най-добрият начин за изчисляване на дължината на речников обект във Flex?

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

Искам да проверя дължината, която трябва да бъде 2 за този речник. Има ли някакъв начин да го направите, освен да преминете през обектите?


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


Отговори (6)


Не, няма начин да се провери дължината на обект (Речникът е почти обект, който поддържа не-низови ключове), освен преминаване през елементите.

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

Вероятно не е нужно да се притеснявате да проверите дали имотът е вътрешен.

person CookieOfFortune    schedule 01.04.2009
comment
Ето кода за цикъл, тъй като никой друг не го е предоставил: '[ public static function getLen(d:Dictionary):int { var i:int = 0; for (var key:Object in d) { i++; } връщане i; }] - person Donal Tobin; 17.08.2009

В as3corelib има функция util, която може да получи ключовете в речника. Можете да разгледате 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 и да добавите тази функционалност и да замените съответните методи.

Като алтернатива можете да го преглеждате всеки път, за да получите дължината, което всъщност не е добра идея, но е налично.

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

Можете също да погледнете тук за информация относно използването на "setPropertyIsEnumerable", но вярвам, че това е по-полезно за обекти, отколкото за речник.

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. Но има DictionaryUtil.getItemCount в библиотеката на Flit. код. 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