Переупорядочивание массива во flash as3

У меня есть массив объектов, каждому из которых присваивается идентификатор при первом создании. Я даю пользователю возможность визуально переупорядочивать объекты, что меняет их положение в массиве. Затем у них есть возможность сохранить этот порядок с помощью flash sharedObject или «cookie», а затем позже, если они снова откроют flash-файл, я хочу, чтобы они могли нажать кнопку, чтобы восстановить этот порядок. Я просто не уверен, каким должен быть синтаксис для установки индекса объекта в массиве. Вот мой код:

ПЕРЕМЕННЫЕ:

var project_settings = SharedObject.getLocal("settings"); //saves all project settings for the next time the file is opened
var project_order:Array = []; //saves project order for the next time the file is opened
var project_display:Array = []; //saves whether each project should be displayed or hidden for the next time the file is opened

СОХРАНИТЬ КОД:

function saveOrder(){
    for (var i=0;i<project_array.length;i++){
        project_order[i] = project_array[i].id;
        project_display[i] = project_array[i].projectThumb.thumbActive;
    }
    project_settings.data.order = project_order;
    project_settings.data.active = project_display;
    //trace (project_settings.data.active[1]);
    project_settings.flush(); //saves most recent "cookie"
}

КОД ВОССТАНОВЛЕНИЯ:

function loadOrder(){
     for (var i=0;i<project_array.length;i++){
/* NEED THE CODE THAT GOES HERE. BASICALLY, PROJECT_ARRAY[i] SHOULD BE THE ITEM WITH AN ID EQUAL TO PROJECT_SETTINGS.DATA.ORDER[i] */
     }


}

person mheavers    schedule 23.03.2011    source источник


Ответы (2)


Что-то вроде этого должно работать:

function loadOrder()
{
    var dict = new Dictionary();

    for (var i = 0; i < project_array.length; i++)
        dict[project_array[i].id] = project_array[i];

    project_array = [];

    for (var i = 0; i < project_settings.data.order.length; i++)
        project_array[i] = dict[project_settings.data.order[i]];
}
person Gerhard Schlager    schedule 23.03.2011

Просто загрузите свой массив и отсортируйте по идентификатору. Что-то вроде этого должно работать:

private function _loadArray():void
{
    // fill in your array
    project_array.sort( this._sortFunc );
}

// replace the * by whatever your object type is
private function _sortFunc( a:*, b:* ):int
{
    return a.id - b.id;
}

Дополнительные сведения: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sort()

Или даже функция sortOn() (что может быть проще) должна работать: http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/Array.html#sortOn()

person divillysausages    schedule 23.03.2011
comment
Это не сработает. project_array содержит объекты, которые необходимо отсортировать. project_settings.data.order содержит идентификаторы объектов в нужном порядке. Ваше решение полностью игнорирует этот второй массив. - person Gerhard Schlager; 24.03.2011
comment
Я думаю, что вам действительно нужен только один массив, если честно. Массив проекта содержит идентификатор позиции и информацию, которую вы хотите отсортировать. После того, как пользователь переупорядочивает их, я сортировал этот массив на основе идентификатора и сохранял его в SharedObject по порядку, чтобы он всегда был в правильном порядке. Кроме этого, решение, предложенное Герхардом, должно работать. - person divillysausages; 24.03.2011
comment
вы, наверное, правы, сосисочка - два массива не нужны однако --› - person mheavers; 24.03.2011