Я думаю, что ответ Капепа является твердым ответом (+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.