5

我有一个名为 Table 的类,它链接到舞台上的剪辑。在设置过程中,我创建了许多 Table 实例,并为每个实例传递一个 TableData 类的实例。此 TableData 对象包含一个 ID 值。

我将我的 Table 对象的选择放入Array我希望根据每个 Table 的 TableData 实例中的 ID 值进行排序的对象中。

我希望使用的是:myArray.sortOn("tableData.id");

这似乎不起作用,我认为Array.sortOn()不能深入到子剪辑中。有没有办法可以做到这一点?

4

1 回答 1

5

TheArray和 genericVector.<>集合都提供了另​​一种形式的.sort()方法,它接受一个函数。您可以提供自己的排序实现,在这种情况下,它会查看对象并仅比较它们的特定部分。

考虑以下类:

class TableData {
    public var ID:String;

    public function TableData(id:String):void {
        this.ID = id;
    }

}

这是您的TableData类的简化版本,仅提供ID. 然后是一个简化的Table类:

class Table {

    private var _data:TableData;

    public function get data():TableData {
        return _data;
    }

    public function Table(tableData:TableData) {
        _data = tableData;
    }

}

最后,让我们使用它们,并启动一个新的集合。

var list:Vector.<Table> = new Vector.<Table>();

list.push(new Table(new TableData("X")));
list.push(new Table(new TableData("C")));
list.push(new Table(new TableData("S")));
list.push(new Table(new TableData("A")));

现在,我们需要创建一个新函数来实际进行比较:

private function sortUsingDataID(a:Table, b:Table):int {
    var aID:String = a.data.ID;
    var bID:String = b.data.ID;
    return aID < bID ? aID == bID ? 0 : -1 : 1;
}

此函数将期望获得两个项目,并且应该返回-101。如果a应该在之前,b那么函数应该返回-1。否则,如果a应该在之后b,那么它应该返回1。最后,如果两者相同,则返回值应为0

.sort所以,现在我们只需要通过调用并传入我们的函数来告诉数组使用我们的自定义排序函数来使用自己。

list.sort(sortUsingDataID);

现在list应该按照您想要的方式进行排序。

在此处查看一个工作示例

有关更多详细信息,请参阅文档

于 2012-12-19T19:36:09.700 回答