Как найти длину ассоциативного массива в 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++;
}