AS3:Whats决定了以下顺序:for..in

时间:2010-01-08 18:54:15

标签: flex actionscript-3 loops for-loop

好的我循环遍历对象中的属性:

private var _propsList:Object = {'Type':'product_type'
                        ,'Kind':'product_type_sub'
                        ,'Stone':'primary_stone'
                        ,'Stone Color':'primary_stone_sub'
                        ,'Metal':'metal_type'
                        ,'Brand':'product_brand'};

for(key in _propsList)
{
    val = _propsList[key];
    trace(key +" = "+ val);
}

我希望第一个跟踪是 Type = property_type ,因为这是第一个在数组中定义的跟踪,但它每次都会随机出现。我想这是因为我的键是字符串而不是整数,但有没有办法指定它循环的顺序?

谢谢!

5 个答案:

答案 0 :(得分:4)

您不能依赖for (v in someObject) ...以可预测的顺序返回内容,不是。

根据您的具体情况,您可以使用数组来保存密钥,然后迭代:

private var keys:Array = ["Type", "Kind", "Stone", "Stone Color", "Metal", "Brand"];

private function iterate():void
{
    for each (var k:String in keys)
    {
        trace(_propsList[k]);   
    }
}

可能有点明显或不优雅,但它可以完成工作。 :)

答案 1 :(得分:0)

你可以通过分类你的“_propsList”对象来破解它,在新创建的PropsList类中创建一个数组,该类按顺序引用属性。此时,您可以在阵列上运行FOR循环并按顺序获取属性。

或者,你可以在新类中有一个函数来返回这些属性的数组。像这样:

public function getProps():Array {
    return [myPropertyOne, myPropertyTwo, myPropertyThree];
}

答案 2 :(得分:0)

一般来说,我认为这种情况下您不应该依赖于您正在使用的框架/语言中的特定行为。这种行为通常记录不清,可以在不同版本之间进行更改。

如果您确实需要特定的检索顺序,我会创建一个包装类,如上面建议的jevinkones。也许在框架中甚至还有一个实用程序类来完成这个(Dictionary等等)?

HTH, KARTHIK

答案 3 :(得分:0)

我发现此链接提供了一些背景信息: Subtle Change in for..in Loops for ActionScript 3

这个问题实际上是this one的重复。

答案 4 :(得分:0)

如何使用这样的数组表示:

var _propsList:Array = [
    ['Type', 'product_type'],
    ['Kind', 'product_type_sub'],
    ['Stone', 'primary_stone'],
    ['Stone Color', 'primary_stone_sub'],
    ['Metal', 'metal_type'],
    ['Brand', 'product_brand']
];

for(var i in _propsList) {
    var elem = _propsList[i];
    var key = elem[0];
    var val = elem[1]
}