Die Array
und generischen Vector.<>
Sammlungen bieten beide eine alternative Form der .sort()
Methode, die eine Funktion übernimmt. Sie können eine eigene Sortierimplementierung bereitstellen, in diesem Fall werden Objekte angezeigt und nur bestimmte Teile davon verglichen.
Betrachten Sie die folgende Klasse:
class TableData {
public var ID:String;
public function TableData(id:String):void {
this.ID = id;
}
}
Dies ist eine vereinfachte Version Ihrer TableData
Klasse, die ein ID
bietet nur. Dann wird eine vereinfachte Table
Klasse:
class Table {
private var _data:TableData;
public function get data():TableData {
return _data;
}
public function Table(tableData:TableData) {
_data = tableData;
}
}
Schließlich läßt sie in Gebrauch genommen, und spinnt eine neue Kollektion auf.
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")));
Jetzt müssen wir eine neue Funktion machen, die unseren Vergleich tatsächlich tun werden:
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;
}
Diese Funktion erwartet zwei Elemente zu erhalten, und soll zurückkehren entweder -1
, 0
oder 1
. Wenn a
sollte vor b
kommen, dann sollte die Funktion -1
zurückgeben. Andernfalls, wenn a
nach b
kommen sollte, sollte es 1
zurückgeben. Schließlich, wenn die zwei gleich sind, sollte es einen Wert von 0
zurückgeben.
So, jetzt müssen wir nur sagen, dass das Array sich selbst mit unserer benutzerdefinierten Sortierfunktion durch Aufruf .sort
und Übergabe unserer Funktion verwenden.
list.sort(sortUsingDataID);
Nun ist die list
sollte die Art und Weise, die Sie wollen sortiert werden.
Siehe eine working example here.
Siehe documentation für weitere Details
Ich habe es geschaffen, das zu umgehen, indem einen doppelten ID-Wert in meiner Tabelle Klasse zu speichern und auf dem Sortieren. Dies funktioniert, ist aber nicht ideal, da sich der ID-Wert ziemlich oft ändert und ich zusätzliche Arbeit brauche, um das Duplikat auf dem neuesten Stand zu halten. Ich bin immer noch interessiert zu hören, ob es einen saubereren Weg gibt, dies zu tun. – popClingwrap