ArrayCollection меняет порядок моих объектов

Сначала я покажу вам функцию.

private var areaCollection:ArrayCollection;

private function generateAreaCollection():void
{
    areaCollection = new ArrayCollection();             
    areaCollection.addItem({Areal: "Totalareal:", Verdi: int(totalArea * 100) / 100 + " kvm"});
    areaCollection.addItem({Areal: "Hovedtakets areal:", Verdi: int(result.area* 100) / 100 + " kvm"});

    //Lots of other stuff omitted (just more addItems).
}

Как видите, порядок, в котором я помещаю элементы в ArrayCollection, - это Areal, затем Verdi (площадь, значение)

Когда я перебираю коллекцию позже, порядок меняется. Теперь Верди, затем Ареал (стоимость, площадь).

Кто-нибудь знает, в чем может быть проблема?

Это действительно портит ситуацию, когда я позже передаю его PHP-скрипту для создания таблиц в html. (У меня есть несколько разных динамических DataGrids, которые различаются по размеру и «значениям», поэтому я не могу напрямую указать на f.ex «Areal» в моем PHP-скрипте)

И, кстати, кто-нибудь знает, как я могу удалить эту надоедливую mx_internal_uid?


person oletk    schedule 04.07.2009    source источник


Ответы (1)


Необработанные объекты в AS3 (класс объектов или объекты, определенные {}) не имеют сортировки. То есть порядок непредсказуем. Думаю, вы путаете две идеи. Строки Areal и Verdi являются ключами в карте объектов. Коллекция массивов - это список, состоящий из двух таких объектов. Таким образом, любая сортировка, применяемая к коллекции массивов, будет сортировать эти объекты, но не внутри объекта.

Поэтому вам нужно обратиться к areaCollection.source[0].Areal, чтобы получить «Totalareal». И areaCollection.source[1].Verdi, чтобы получить int(result.area* 100) / 100 + " kvm"

Если вы сделаете for(var s:String in areaCollection.source[0]) { }, вы выполните итерацию дважды, при этом значение «s» будет «Areal» и «Verdi» или наоборот (например, порядок не гарантирован).

Есть смысл? Если вам нужен порядок, вы можете сделать объект массивом вместо ["Totalareal", (int(totalArea * 100) / 100 + " kvm")], а затем получить доступ к «Верди», используя [1].

P.s. не уверен, как удалить mx_internal_id.

person Glenn    schedule 05.07.2009
comment
Я понимаю. Тогда еще один вопрос: как я могу использовать ArrayCollection в качестве поставщика данных для DataGrid (Flex 3), если массив не ассоциативен? Можно ли получить доступ к массиву [0] в dataField? - person oletk; 05.07.2009
comment
Мой опыт работы с DataGrid ограничен, но я думаю, что ваш исходный подход верен. Вам нужна коллекция ассоциативных объектов ArrayCollection. Поскольку вы знаете порядок столбцов, возможно, вы захотите создать отдельную статическую карту столбцов для индексов, прежде чем отправлять их в свой PHP-скрипт? например, MAP = {Areal: 0, Verdi: 1}, а затем напишите функцию сериализации, которая превращает эти объекты в массивы. var phpArray: Array = []; для каждого (var o: объект в arrayCollection) {var tmpA: Array = []; для (var s: строка в o) {tmpA [MAP [s]] = o [s]; } phpArray.push [tmpA]; } - person Glenn; 05.07.2009