Apache flex Flex/AS3-用于的问题。。。修改循环源值时在构造中

Apache flex Flex/AS3-用于的问题。。。修改循环源值时在构造中,apache-flex,actionscript-3,Apache Flex,Actionscript 3,免责声明:对于Flex/AS3来说相对较新,我可能遗漏了一些明显的东西 在做了一些研究之后,似乎使用for(var属性:String in object)并不能保证属性的枚举顺序,但是它并没有说明如何修改属性指向的值来更改for…in循环。有关背景信息,请参阅 我的例子如下: for(var i:int = 0; i<objectArray.length; i++) { for(var property:String in objectArray[i]) {

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

在做了一些研究之后,似乎使用for(var属性:String in object)并不能保证属性的枚举顺序,但是它并没有说明如何修改属性指向的值来更改for…in循环。有关背景信息,请参阅

我的例子如下:

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

for(var i:int=0;i更改正在循环的变量的内容很少是一件好事。
例如,在Java中,您不能迭代正在修改的对象


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

您的分配扰乱了迭代器的顺序,在您看来,仅仅是在对象上重新分配一个成员可能会在幕后发生完全不同的事情。我猜您选择的对象是什么是否迭代不是一个密封类

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

首先迭代数组以创建(新)键数组


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

我想,这个选择是为了性能


为了确保改变底层结构不会对迭代产生任何影响,需要首先将所有键提取到一个列表中,然后在该列表上进行迭代……这会产生一个额外的迭代,而且,第一个可能是不必要的,例如,如果您正在执行搜索操作,这意味着您可能会在有一点…

这很奇怪。你是肯定“c”是同一个属性,还是只是你的两个属性具有相同的值?是的,每个属性都是唯一的。出现此问题的原因是,在某些情况下,它跳过了其中一个实际上必须具有未设格值的属性,或者显示不正确。作为一个例子t、 跟踪数组中每个属性的值(不改变它,即注释掉当前行),看看它是否命中两次。如果没有,我倾向于使用AndreaG并声明“如果要更改某些内容,请使用副本”修改它可能会对集合产生影响。仅使用跟踪,循环会按预期运行。但仍然有点奇怪,循环似乎不仅基于属性,而且基于属性指向的值。是的,创建一个副本并进行更改确实有效(这也是我的解决方案)。但是,当对一个对象的属性进行迭代时,更改属性指向的值会改变迭代顺序,这真的有意义吗?我认为是的。也就是说,因为你做了一件坏事(在阅读时更改内容),不再有任何保证。因此,我们都同意正在发生的事情,以及解决问题的方法。希望这能在将来帮助其他人,如果他们有相同的问题。我的新问题是,这种行为有意义吗?或者这是他们的一个实现错误?