我认为 kapep 的答案是一个可靠的答案 (+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 如何处理函数有所了解。 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的函数,它有两个参数,如果第三个元素a大于第三个元素b,则返回1,如果b更大,则返回-1比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);
所以在 kapep 的回答中,他建议使用 sortOn,这有点像生成我之前编写的排序函数的小帮手 (sortOnThirdElement)。它基本上是说只比较这个数组中每个项目的一个名为 "2" 的属性,并以数字 (Array.NUMERIC) 而不是字符串进行比较(默认情况下,100 位于 99 之前)。或多或少,它会根据您给它的输入动态生成一个比较函数,然后使用它进行排序。
但希望这能进一步解释 ActionScript 中排序的工作原理。