迭代对象数组

时间:2012-02-09 22:28:41

标签: flash actionscript

我创建了一个MovieClip的关联数组,但是当我尝试迭代它们时,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 个答案:

答案 0 :(得分:2)

试试这个:

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
}

答案 1 :(得分:0)

使用push()功能添加到您的阵列:

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

数组使用数字索引来检索数据。如果您想拥有一个使用字符串进行检索的关联容器,请查看Dictionary类:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/Dictionary.html

答案 2 :(得分:0)

首先,在我看来,你的问题是你从未真正打电话给registerNavigationEvents() ......

无论如何,如果要创建关联数组,则必须使用ObjectDictionaryArray默认有一个数字索引。

您可以使用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];
}

还有一些差异,但您可以自己阅读hereAS3 doc

您可以使用括号运算符指定值,就像在代码中一样,或使用点语法:

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

虽然很明显,但这意味着你的所有字典键都是字符串。请注意,使用点语法意味着实际上使用的字典与Object完全相同;通过使用对象指针作为键来实现从Dictionary获得的速度提升 - 这不能用字符串和数字来完成。

您可以使用for each...in

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

这也适用于词典和对象。但是,您无法确定返回值的顺序

答案 3 :(得分:0)

首先,要理解术语:不,你没有创建一个关联数组。 AS3不提供关联数组的实现。关联数组是键值对的序列(序列与set的不同之处在于它定义了它的元素的顺序)。不需要序列对是唯一的(数组是序列的特定情况,并且数组通常多次包含相同的元素)。关联数组也可以包含多次相同的元素。一个典型的例子是get请求,其中包含以下内容:example.org/?foo=bar&foo=bar

现在,您创建的内容可以被视为一组字符串键,它映射到一组其他对象,并要求每个字符串都是唯一的。通常,在其他语言中,此构造称为地图。但是,地图意味着某些习惯性的实施。 Map通常具有特殊的内存分配方法,散列密钥以便更快地访问,计算地图中包含的项目数等。将地图实现为树木的情况并不少见。

所以,最后,发生了什么是你创建了一个动态类的实例,并为它添加了一些属性。更复杂的事情:)类的属性不是字符串!它们是QName(限定名称)。即对名称空间和字符串键。备份这些属性的机制与map非常相似,但是,没有给出所有控件以将其用作实际映射。

我已经描述了这一切,以便说服你从“计算机”的角度来看更直接的方法是使用任何一个数组:

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)操作,因为在最坏的情况下,它需要查看数组的每个元素以找到您要查找的元素索引,而{ {1}}是O(1)操作。但是,如果你需要通过它的键来找到对象,那么恰恰相反:dictionary[key]是一个O(1)操作,但你需要循环遍历字典以找到你需要的密钥。 / p>

array[index]

在输出中你看到一个数字,在代码中使用实际数字,只要在输出中你看到一个基数,就会使用一个复杂的对象。