2012-12-19 16 views
5

Ho una classe denominata Tabella collegata a una clip sullo stage. Durante l'installazione creo molte istanze di tabella e passiamo a ciascuna un'istanza di una classe TableData. Questo oggetto TableData include un valore ID.Ordina una matrice di clip film su valori all'interno delle clip secondarie

Ho inserito una selezione dei miei oggetti Table in un Array, che sarebbe stato possibile ordinare in base al valore ID all'interno dell'istanza di TableData di ogni tabella.

Quello che avevo sperato di utilizzo era qualcosa di simile: myArray.sortOn("tableData.id");

Questo non sembra funzionare e presumo che Array.sortOn() non può drill-down in clip bambino. C'è un modo per raggiungerlo?

+0

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

risposta

5

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

+0

Saluti :) Buona risposta, ben spiegato. Grazie per l'aiuto. – popClingwrap