AS3: Что определяет порядок: для ... в - PullRequest
2 голосов
/ 08 января 2010

ОК. Я перебираю свойства объекта следующим образом:

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 , поскольку она является первой, определенной в массиве, однако каждый раз она появляется случайным образом. Я предполагаю, что это потому, что мои ключи являются строками, а не целыми числами, однако есть ли способ указать порядок, в котором они проходят через них?

Спасибо !!

Ответы [ 4 ]

4 голосов
/ 09 января 2010

Вы не можете полагаться на 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]);   
    }
}

Может быть, немного очевидным или не элегантным, но это сделало бы работу. :)

0 голосов
/ 09 января 2010

В общем, я думаю, что это тот случай, когда вы не должны зависеть от конкретного поведения используемой вами платформы / языка. Этот тип поведения, как правило, плохо документирован и может меняться от версии к версии.

Если вам действительно нужен определенный порядок поиска, я бы создал класс-оболочку, как предложено выше для jevinkones. Может быть, где-нибудь в рамках фреймворка есть еще какой-нибудь служебный класс (словарь и т. Д.?

НТН, Картик

0 голосов
/ 09 января 2010

Я нашел эту ссылку, которая дает некоторую предысторию: Тонкое изменение в for..in Loops for ActionScript 3

Этот вопрос фактически является дублированием этого .

0 голосов
/ 08 января 2010

Вы можете взломать его, отсекая свой объект "_propsList", создавая массив во вновь созданном классе PropsList, который ссылается на свойства по порядку. В этот момент вы можете запустить цикл FOR для массива и привести свои свойства в порядок.

ИЛИ, у вас может быть функция внутри этого нового класса, которая будет возвращать массив этих свойств. как это:

public function getProps():Array {
    return [myPropertyOne, myPropertyTwo, myPropertyThree];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...