2012-12-19 2 views
5

Ich habe eine Klasse namens Table, die mit einem Clip auf der Bühne verknüpft ist. Während des Setups erstelle ich viele Tabelleninstanzen und übergebe jedem eine Instanz einer TableData-Klasse. Dieses TableData-Objekt enthält einen ID-Wert.Sortiert ein Array von MovieClips nach Werten in ihren untergeordneten Clips

Ich habe eine Auswahl meiner Table-Objekte in eine Array gelegt, die ich nach dem ID-Wert in jeder Table-Instanz von TableData sortieren würde.

Was ich Gebrauch war so etwas wie gehofft hatte: myArray.sortOn("tableData.id");

Dies nicht zu funktionieren und ich nehme an, dass Array.sortOn() nicht Drilldown in Clips Kind zu sein scheint. Gibt es eine Möglichkeit, dass ich das erreichen kann?

+0

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

Antwort

5

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

+0

Prost :) Gute Antwort, gut erklärt. Danke für Ihre Hilfe. – popClingwrap

Verwandte Themen