Kolekcje Array
i generycznezapewniają alternatywną formę metody .sort()
, która przyjmuje funkcję. Możesz podać własną implementację sortowania, w tym przypadku, która zagląda do obiektów i porównuje tylko określone fragmenty.
Rozważmy następujące klasy:
class TableData {
public var ID:String;
public function TableData(id:String):void {
this.ID = id;
}
}
Jest to uproszczona wersja klasy TableData
że tylko dostarcza ID
. Następnie uproszczony Table
klasa:
class Table {
private var _data:TableData;
public function get data():TableData {
return _data;
}
public function Table(tableData:TableData) {
_data = tableData;
}
}
Wreszcie, pozwala umieścić je w użyciu, a kręcić nową kolekcję.
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")));
Teraz musimy utworzyć nową funkcję, która będzie faktycznie naszego porównania:
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;
}
Ta funkcja będzie oczekiwać, aby uzyskać dwa elementy, a powinien zwrócić albo -1
, 0
lub 1
. Jeśli a
ma przyjść przed b
, funkcja powinna wrócić -1
. W przeciwnym razie, jeśli a
powinno przyjść po b
, to powinno wrócić 1
. Wreszcie, jeśli oba są takie same, wówczas powinien zwrócić wartość 0
.
Teraz musimy po prostu powiedzieć tablicy, aby uciec się, korzystając z naszej niestandardowej funkcji sortowania, dzwoniąc pod numer .sort
i przekazując naszą funkcję.
list.sort(sortUsingDataID);
Teraz list
powinny być posortowane w sposób, w jaki chcesz.
Zobacz working example here.
documentation Zobacz więcej szczegółów
udało mi się ominąć ten przechowując duplikat wartość identyfikatora w mojej klasie tabeli i sortowanie w tej sprawie. To działa, ale nie jest idealne, ponieważ wartość identyfikatora zmieni się dość często i muszę dołożyć dodatkowych starań, aby duplikat był aktualizowany. Nadal jestem zainteresowany, aby usłyszeć, czy jest to lepszy sposób na zrobienie tego. – popClingwrap