由对象索引的Flex和关联数组

时间:2013-01-17 12:38:24

标签: actionscript-3 flex associative-array

环境:Flex 3.6

看看这段代码:

    var arr:Array = new Array()
    var t:Object = {number:"12345", id:"Public"};
    arr[t] = "Hello";

    for (var z:Object in arr)
    {
        if (z is String)
            trace("STRING");
        if (z is Object)
            trace("OBJECT");
        trace("z.number = " + z.number);
    }

输出:

STRING
OBJECT

然后在最后一次trace()调用时崩溃并出现错误:

ReferenceError: Error #1069: Property number not found on String and there is no default value

对象是否应该保留字段的名称? 我做错了什么?

2 个答案:

答案 0 :(得分:4)

for(var key)对象Array的{​​{1}}循环中始终为key。您可以使用String,然后Dictionary将是对象的类型,您的代码将起作用:

key

答案 1 :(得分:0)

数组的键通常是数字。 这一行:

arr[t] = "Hello";

可能没有按照您的期望进行操作,因为它将对象t转换为字符串以用作数组中的键。它被转换为字符串“[object Object]”。

此代码中存在几个问题:

for (var z:Object in arr)
{
    if (z is String)
        trace("STRING");
    if (z is Object)
        trace("OBJECT");
    trace("z.number = " + z.number);
}

Z应该是String而不是Object类型,但是如果你想查看数组中的每个项目,并且你想要为每个循环而不是for循环使用a。由于数组可以包含不同的类型,因此z必须是“*”类型。

最后,正在运行z.number的跟踪,无论z是什么类型,只有当z是一个Object时才应该运行它。 (并且还假设数组中的所有对象都具有数字属性。)

arr[0] = "Hello";
arr[1] = t;

for each (var z:* in arr)
{
    if (z is String)
        trace("STRING");

    if (z is Object) {
        trace("OBJECT");
        trace("z.number = " + z.number);
     }
}