Flex / AS3 - 修改循环源值时for ... in构造中的问题

时间:2009-12-09 14:53:55

标签: flex actionscript-3

免责声明:Flex / AS3相对较新,我可能会遗漏一些明显的东西。

在做了一些研究之后,似乎使用for(var属性:对象中的String)并不能保证属性的枚举顺序,但是它没有说明修改属性指向的VALUE作为更改for的内容。 ..in循环。有关背景信息,请参阅For-Each Loop AS3: Is the direction guaranteed?

我的例子如下:

for(var i:int = 0; i<objectArray.length; i++)
{
    for(var property:String in objectArray[i])
    {
        objectArray[i][property] = unescape(objectArray[i][property]);
    }
}

objectArray [i]具有属性a,b,c,d,e,f。当我在这里单步执行代码时,我得到c,b,d,c,a,f。请注意,我得到了两次。

作为一个解决方案,我可以创建一个临时对象来存储数据,同时在原始对象上执行循环,然后用修改后的数据替换原始对象,但我想知道究竟发生了什么。 / p>

所以我的问题是,对象属性的值是否会修改for ... in构造的循环顺序?如果是这样,它应该或者这是一个错误吗?

3 个答案:

答案 0 :(得分:2)

更改正在循环的变量的内容很少是一件好事。 例如,在Java中,您无法迭代正在修改的内容。

您应该制作副本,处理副本,并在循环结束后,在一条指令中将新数据重新分配给变量。

答案 1 :(得分:1)

你的作业正在搞乱迭代器顺序,你看起来只是在一个对象上重新分配一个成员可能会在幕后产生很大的不同。我猜你正在迭代的对象不是一个密封的类?

正如AndreaG提到你可以在副本上进行更改,如果你不想改变对原始数组的引用但是不介意迭代两次,还有另一种选择。

首先遍历数组以创建(新)键数组。

然后,遍历键数组并更新原始对象上的值。

答案 2 :(得分:0)

我猜,这个选择是为了表现......

要确保改变底层结构对迭代没有任何影响,需要首先将所有键提取到列表中,然后迭代该列表...进行1次额外迭代,并且,第一次可能是不必要的,如果你正在进行搜索操作,这意味着你可能会在某个时候取消迭代......