【问题标题】:AS3 - Sorting an array of nested arraysAS3 - 对嵌套数组的数组进行排序
【发布时间】:2011-11-04 11:51:14
【问题描述】:

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

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);

我想得到一个使用嵌套数组第三个元素排序的数组。

所以跟踪 sortedParentArray 会给我: 0,0,1,0,0,3,0,0,7,0,0,9

即nestedArray1、nestedArray4、nestedArray3、nestedArray2

谢谢,

标记

【问题讨论】:

    标签: flash actionscript-3


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 会给这个伟大而简单的例子+2,但没有这样的按钮:(
    • 这给了我完美的结果。感谢您的回复;)
    【解决方案2】:

    我认为 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更大,则返回-1a,如果它们相同,它将返回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 中排序的工作原理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-04
      • 2016-07-01
      • 2016-05-19
      • 2020-02-06
      • 1970-01-01
      相关资源
      最近更新 更多