AS3 - сортировка массива вложенных массивов - PullRequest
4 голосов
/ 04 ноября 2011

Как мне отсортировать массив вложенных массивов на основе содержимого одного из элементов вложенных массивов?

var nestedArray1:Array = new Array(0,0,1);
var nestedArray2:Array = new Array(0,0,9);
var nestedArray3:Array = new Array(0,0,7);
var nestedArray4:Array = new Array(0,0,3);

var parentArray:Array = new Array(nestedArray1,nestedArray2,nestedArray3,nestedArray4);

Я бы хотел получить массив, отсортированный с использованием вложенных массивов.3-й элемент.

Таким образом, трассировка sortedParentArray выдаст мне: 0,0,1,0,0,3,0,0,7,0,0,9

, то есть nestedArray1, nestedArray4, nestedArray3, nestedArray2

Спасибо,

Mark

Ответы [ 2 ]

10 голосов
/ 04 ноября 2011

Поскольку вы можете обращаться к индексу массива так же, как и к свойству (array[2] совпадает с array["2"]), вы можете использовать sortOn .

parentArray.sortOn("2", Array.NUMERIC);

Youтакже можно использовать другие индексы в качестве полей второго или третьего сортировки, если не требуется непредсказуемый порядок для равных записей.

parentArray.sortOn(["2","1","0"], Array.NUMERIC);
4 голосов
/ 04 ноября 2011

Я думаю, что ответ Капепа является твердым ответом (+1), но просто для объяснения, вот что происходит.

Итак, у вас есть несколько массивов:

var nestedArray1:Array = new Array(0,0,1);
var nestedArray2:Array = new Array(0,0,9);
var nestedArray3:Array = new Array(0,0,7);
var nestedArray4:Array = new Array(0,0,3);

И затемэти массивы помещаются в другой массив:

var parentArray:Array = new Array(nestedArray1,nestedArray2,nestedArray3,nestedArray4);

Таким образом, ваш родительский массив выглядит примерно так:

var parentArray:Array = [
    [0,0,1],
    [0,0,9],
    [0,0,7],
    [0,0,1]
];

Итак, чтобы действительно понять, как работает сортировка в ActionScript, вы должны выполнитьнемного понять о том, как Flash обрабатывает функции.Функции во флэш-памяти могут быть первоклассными объектами, что означает, что вы можете использовать функцию точно так же, как и любой другой тип объекта, назначить ее переменной, передать функцию другой функции в качестве аргумента при ее вызове, и тому подобное.

Итак, давайте сначала посмотрим на одно:

var sortOnThirdElement:Function = function(a:Array, b:Array):int {
    if(a[2] > b[2]) return 1;
    if(a[2] < b[2]) return -1;
    return 0;
}

Здесь я создаю функцию с именем sortOnThirdElement, она принимает два аргумента и вернет 1, если третий элемент aбольше третьего элемента b или -1, если b больше a, и если они одинаковы, он вернет 0.Итак, давайте сделаем небольшой тестовый прогон:

trace(sortOnThirdElement(nestedArray1, nestedArray2)) // -1
trace(sortOnThirdElement(nestedArray3, nestedArray3)) // 0
trace(sortOnThirdElement(nestedArray4, nestedArray1)) // 1

Хорошо выглядит.Мы вызываем нашу маленькую функцию, и она должна сказать нам, в каком порядке они должны быть. Но на самом деле она не сортирует наш родительский массив.Вот тут и приходит Array.sort().

Вызов Array.sort() без аргументов означает, что он будет выполнять некоторую сортировку по умолчанию (в основном простая сортировка строк без учета регистра), но есть и другой способ использования Array.sort().Вы можете передать ему функцию, которая будет выполнять сравнение, которое вы хотите;или в этом случае наша sortOnThirdElement функция.

parentArray.sort(sortOnThirdElement);
trace(parentArray);  // 0,0,1,0,0,3,0,0,7,0,0,9
// or really [[0,0,1],[0,0,3],[0,0,7],[0,0,9]]

Ваша функция сортировки может быть настолько сложной или простой, как вам нравится.Он в основном проходит по вашему массиву, вызывая вашу функцию сортировки столько раз, сколько нужно, пока ваш массив не окажется в правильном порядке.Он использует возвращаемые значения (-1,0,1), чтобы понять это.Строго набранный Vectors также обладает этой функциональностью.

Если бы я хотел убывать, я мог бы просто сказать:

parentArray.sort(sortOnThirdElement, Array.DESCENDING);

Так что в ответе Капепа он предложил использовать sortOn, то естькак маленький помощник для генерации функции сортировки, которую я написал ранее (sortOnThirdElement).По сути, это означает, что нужно сравнивать только свойство с именем "2" для каждого элемента в этом массиве и выполнять сравнение численно (Array.NUMERIC), а не по строке (по умолчанию, где 100 предшествует 99).Более или менее, он динамически генерирует функцию сравнения на основе введенного вами ввода, а затем сортирует по нему.

Но, надеюсь, это объясняет немного больше о том, как работает сортировка в ActionScript.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...