Итерация по массиву объектов - PullRequest
1 голос
/ 10 февраля 2012

У меня есть созданный ассоциативный массив MovieClips, но когда я пытаюсь перебрать их, цикл for никогда не включается (ничего не выводится). Это как-будто массив пуст.

Есть идеи?

var navItems:Array = new Array();
navItems["home"] = item_home;
navItems["featuredfilms"] = item_featuredfilms;
navItems["nowshowing"] = item_nowshowing;
navItems["trailers"] = item_trailers;
navItems["comingsoon"] = item_comingsoon;
navItems["yourtickets"] = item_yourtickets;

function registerNavigationEvents():void {
    for (var item in navItems) {
        trace("Hello");
        //item.addEventListener(MouseEvent.MOUSE_OVER, handleNavToggle);
    }
}

Словарь:

var navItems:Dictionary = new Dictionary();
navItems["featuredfilms"] = item_featuredfilms;
navItems["nowshowing"] = item_nowshowing;
navItems["trailers"] = item_trailers;
navItems["comingsoon"] = item_comingsoon;
navItems["yourtickets"] = item_yourtickets;

function registerNavigationEvents():void {
    for(var key:String in navItems) {
        trace("Hello");
        //item.addEventListener(MouseEvent.MOUSE_OVER, handleNavToggle);
    }
}

Ответы [ 4 ]

2 голосов
/ 10 февраля 2012

Попробуйте это:

for ( var key:String in navItems ) {
    var mc:MovieClip = navItems[key] as MovieClip;
    // do stuff here
}

или:

for each ( var item:MovieClip in navItems ) {
    // do stuff here
}
0 голосов
/ 10 февраля 2012

Прежде всего, чтобы выровнять терминологию: нет, вы не создали ассоциативный массив.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
}

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

0 голосов
/ 10 февраля 2012

Прежде всего, мне кажется, ваша проблема в том, что вы на самом деле никогда не вызываете registerNavigationEvents() ...

В любом случае, если вы хотите создать ассоциативный массив, вы должны использовать либо Object или Dictionary.Array имеет числовой индекс по умолчанию.

Вы можете перебирать ключи в обоих ассоциативных типах, используя for...in, они отличаются в основном тем, что Dictionary принимает любой объект в качестве ключав то время как Object принимает только строки:

var obj:Object = {};
for (var key : String in obj) {
    var value : Object = obj[key];
}

var dict:Dictionary = new Dictionary();
for (var key : Object in dict) {
    var value : Object = dict[key];
}

Есть еще несколько отличий, но вы можете прочитать об этом здесь или в AS3 doc самостоятельно.

Вы можете присваивать значения с помощью оператора скобок, как вы это делали в своем коде, или использовать точечный синтаксис:

obj.key = value;   // same as obj["key"] = value;
dict.key = value;  // same as dict["key"] = value;

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

Вы можете повторять значения массива , используя for each...in:

var array:Array = [];
for each (var item:Object in array) { 
   // item can also have strong typing, it will be cast automatically
}

Это также работает для словарей и объектов.Однако вы не можете быть уверены в порядке, в котором возвращаются значения !

0 голосов
/ 10 февраля 2012

Используйте функцию push() для добавления в ваш массив:

navItems.push(item_home);
//...
navItems.push(item_yourtickets);

Массив использует числовой индекс для извлечения данных. Если вы хотите иметь ассоциативный контейнер, который использует строку для извлечения, посмотрите в классе Dictionary: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Dictionary.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...