2012-12-19 10 views
5

Mam klasę o nazwie Tabela powiązaną z klipem na scenie. Podczas instalacji tworzę wiele instancji Table i przekazuję każdemu instancję klasy TableData. Ten obiekt TableData zawiera wartość identyfikatora.Sortowanie liczby klipów MovieClip na wartościach w klipach potomnych

Położyłem zaznaczenie moich obiektów tabelkowych w Array, które chciałabym posortować eto na podstawie wartości identyfikatora w instancji TableData każdej tabeli.

Co miałem nadzieję użytku było coś takiego: myArray.sortOn("tableData.id");

to nie wydaje się do pracy i zakładam, że Array.sortOn() nie może drążyć klipów podrzędnych. Czy istnieje sposób, w jaki mogę to osiągnąć?

+0

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

Odpowiedz

5

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

+0

Pozdrawiam :) Dobra odpowiedź, dobrze wyjaśnione. Dzięki za pomoc. – popClingwrap

Powiązane problemy