AS3 - 对嵌套数组的数组进行排序

时间:2011-11-04 11:51:15

标签: flash actionscript-3

我如何根据其中一个嵌套数组元素的内容对嵌套数组的数组进行排序?

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

谢谢,

标记

2 个答案:

答案 0 :(得分:10)

由于您可以使用与属性相同的方式访问数组索引(array[2]array["2"]相同),因此您可以使用sortOn

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

如果不希望有相同条目的不可预测的顺序,您也可以将其他索引用作第二或第三排序字段。

parentArray.sortOn(["2","1","0"], Array.NUMERIC);

答案 1 :(得分:4)

我认为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的函数,它接受两个参数,如果第三个元素1大于第三个元素a,则返回b,或{ {1}}如果-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

您的排序功能可以像您希望的那样复杂或简单。它基本上遍历你的数组,根据需要多次调用sort函数,直到你的数组顺序正确。它使用返回值(-1,0,1)来计算出来。强类型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]] 也具有此功能。

如果我想降序,我可以简单地说:

Vectors

所以在kapep的回答中,他建议使用parentArray.sort(sortOnThirdElement, Array.DESCENDING); ,这有点像生成我之前编写的排序函数(sortOn)的小助手。它基本上只是说比较一个名为sortOnThirdElement的属性在这个数组中的每个项目上并用数字("2")而不是字符串进行比较(默认情况下,Array.NUMERIC来自{{1} }})。或多或少,它根据您提供的输入动态生成比较函数,然后使用它进行排序。

但希望这更多地解释了ActionScript中的排序方式。