Как найти длину ассоциативного массива в ActionScript 3.0?
Есть ли простой способ получить длину ассоциативного массива (реализованного как Object
) в ActionScript 3.0?
Я понимаю, что существуют два основных способа создания ассоциативных массивов в AS3:
- Использовать объект
Dictionary
; особенно удобно, когда ключ не должен быть string
- Используйте
Object
и просто создайте свойства для каждого желаемого элемента. Имя свойства - это ключ, а значение - нулевое значение.
В моем приложении используется подход # 2 (с использованием класса Object
для представления ассоциативных массивов).
Я надеюсь, что есть нечто более родное, чем мой цикл for
, который вручную подсчитывает все элементы.
Ответы
Ответ 1
Вы должны считать их в цикле for так же, как и вы. Конечно, вы можете создать класс и придерживаться цикла for в этом классе.
Для некоторых больших внедрений Коллекций в AS3, проверьте этих парней.
Изменить 2013 Не удивительно, что ссылки разрываются по времени. Попробуйте этот новый: http://www.grindheadgames.com/get-the-length-of-an-object.
Ответ 2
Проведение нескольких тестов на этом действительно меня удивило. Здесь нормальное использование массива:
var things:Array = [];
things.push("hi!");
trace(things.length);
// traces 1
trace(things);
// traces hi!
Здесь, если мы установим значение в строку:
var things:Array = [];
things["thing"] = "hi!";
trace(things.length);
// traces 0
trace(things);
// traces an empty string
trace(things["thing"]);
// traces hi!
В принципе, если вы добавляете вещи с помощью строк, вы устанавливаете свойства, а не добавляете их в массив. Заставляет меня задаться вопросом, почему Array динамичен таким образом.
Итак... да, подсчитайте элементы с помощью for for... in loop!
Ответ 3
Я думаю, вы застряли в подсчете их "вручную".
Параметр должен состоять в том, чтобы обернуть все это в класс и сохранить отдельную переменную, которую вы обновляете при добавлении/удалении.
Ответ 4
var count:int;
var key:String;
for (key in myObject)
{
count++;
}
trace ("myObject has this many keys in it: " + count);
или, альтернативно, для каждого синтаксиса (я не тестировал, чтобы узнать, что быстрее)
for each (var o:* in myObject)
{
count++;
}