Le collezioni Array
e generica Vector.<>
forniscono entrambe una forma alternativa del metodo .sort()
che accetta una funzione. È possibile fornire la propria implementazione di ordinamento, in questo caso che fa sbirciare gli oggetti e li confronta solo con pezzi specifici.
Si consideri la seguente classe:
class TableData {
public var ID:String;
public function TableData(id:String):void {
this.ID = id;
}
}
Questa è una versione semplificata della classe TableData
che fornisce solo un ID
. Poi una semplificata Table
classe:
class Table {
private var _data:TableData;
public function get data():TableData {
return _data;
}
public function Table(tableData:TableData) {
_data = tableData;
}
}
Infine, consente di mettere loro di utilizzare, e girare una nuova collezione.
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")));
Ora, abbiamo bisogno di fare una nuova funzione che effettivamente fare il nostro confronto:
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;
}
Questa funzione si aspettano di ottenere due elementi, e deve restituire uno -1
, 0
o 1
. Se a
dovesse arrivare prima di b
, la funzione dovrebbe restituire -1
. Altrimenti, se a
dovesse arrivare dopo b
, dovrebbe restituire 1
. Infine, se i due sono uguali, allora dovrebbe restituire un valore di 0
.
Quindi, ora abbiamo solo bisogno di dire all'array di ricorrere a se stesso usando la nostra funzione di ordinamento personalizzato chiamando lo .sort
e passando nella nostra funzione.
list.sort(sortUsingDataID);
Ora il list
devono essere ordinati il modo in cui si desidera.
Vedere un working example here.
Vedere la documentation per maggiori dettagli
sono riuscito a aggirare questo memorizzando un valore di ID duplicato nella mia classe tabella e ordinamento su questo. Funziona ma non è l'ideale dato che il valore ID cambierà molto spesso e devo fare un lavoro extra per mantenere aggiornato il duplicato. Sono ancora interessato a sapere se c'è un modo più pulito per farlo. – popClingwrap