Прежде всего, чтобы выровнять терминологию: нет, вы не создали ассоциативный массив.AS3 не обеспечивает реализацию для ассоциативных массивов.Ассоциативный массив - это последовательность пар ключ-значение (последовательность отличается от заданной тем, что она определяет порядок своих элементов).Для последовательности не требуется, чтобы пары были уникальными (массивы являются частным случаем последовательности, и обычно массивы содержат один и тот же элемент несколько раз).Ассоциативный массив может также содержать один и тот же элемент более одного раза.Типичным примером является запрос get, который содержит что-то вроде этого: example.org/?foo=bar&foo=bar
.
Теперь то, что вы создали, можно рассматривать как набор строковых ключей, который отображается на набор некоторых других объектов, сТребование, чтобы каждая строка была уникальной.Обычно в других языках эта конструкция называется картой.Однако карта подразумевает определенную обычную реализацию.Карта обычно имеет специальные методы для выделения памяти, хеширования ключей для более быстрого доступа, вычисления количества элементов, содержащихся в карте и т. Д. Нередко карты реализуются в виде деревьев.
Итак, наконец,произошло то, что вы создали экземпляр динамического класса и добавили в него некоторые свойства.Чтобы усложнить вещи еще дальше :) свойства класса не строки!Это QName (квалифицированные имена).Т.е. пары пространств имен и строковых ключей.Механизм, который создает резервные копии этих свойств, очень похож на карту, однако вам не предоставлены все элементы управления, чтобы использовать его в качестве реальной карты.
Я описал все это, чтобы убедить вас в том, чтоболее простым способом с точки зрения «компьютера» было бы использование либо массива:
var navItems:Array = [item_featuredfilms, item_nowshowing,
item_trailers, item_comingsoon, item_yourtickets];
, и в этом случае вы позже можете ссылаться на каждый элемент navItems[x]
, x
, являющийся смещением вмассив.Вы можете использовать циклы for-in и for-each в этом массиве, перебирая ключи и значения соответственно.
В качестве альтернативы вы можете использовать Dictionary, однако не так, как вы это делали изначально:
var navItems:Dictionary = new Dictionary();
navItems[item_featuredfilms] = "featuredfilms";
. . .
navItems[item_yourtickets] = "yourtickets";
Опять же, позже вы можете перебирать ключи для for-in (ключи - это объекты, а не строки) и для значений с помощью for-each (значения в этом примере являются строками).
Какой из них выбрать, зависит от вас.Вы должны учитывать следующие факторы: Array.indexOf()
- это операция O (n), поскольку в худшем случае необходимо просмотреть каждый элемент массива, чтобы найти искомый индекс элемента, а dictionary[key]
является операцией O (1).Однако, если вам нужно найти объект по его ключу, то все наоборот: array[index]
- это операция O (1), но вам нужно перебрать словарь, чтобы найти нужный ключ.
private function iterateTest():void
{
var dictionary:Dictionary = new Dictionary();
var array:Array = [];
// Array is a complex type, thus, it will be used
// by reference, and it is OK to use it as
// dictionary keys
var one:Array = ["one"];
var two:Array = ["two"];
var three:Array = ["three"];
var key:Object;
var value:Object;
dictionary[one] = 1;
dictionary[two] = 2;
dictionary[three] = 3;
// note, you could do this in plenty of ways,
// for example: array.push(one, two, three)
// or array = [one, two, three]
// I did it like this for consistency of this example only.
array[1] = one;
array[2] = two;
array[3] = three;
for each (value in dictionary) trace(value);
for (key in dictionary) trace(key, dictionary[key]);
for each (value in array) trace(value);
for (key in array) trace(key, array[key]);
// Output:
// 1
// 2
// 3
// one 1
// two 2
// three 3
// one
// two
// three
// 1 one
// 2 two
// 3 three
}
везде, где на выходе вы видите цифру, в коде использовалось действительное число, всякий раз, когда на выходе вы видите кардинал, использовался сложный объект.