2011-12-29 15 views
8

W JavaScript muszę zamówić obiekty w tablicy według typu. Każdy typ ma wyższy priorytet, więc obiekt o typie "wytrzeć" powinien mieć najwyższy priorytet, dlatego powinien znajdować się z przodu tablicy (indeks = 0).Sortowanie obiektów zgodnie z określoną regułą

Jaki byłby najlepszy sposób sortowania tych obiektów? Czy istnieje funkcja wbudowana, która może to zrobić?

Dla np

function sortObjects(objs) 
{ 
    // objs is an unsorted array of objects 
    var animPriority = {"wipe": 1, "fly": 2, "iris": 3, "flip": 4, "cube": 5, "blur": 6, "zoom": 7, "fade": 8, "glow": 9, "rotate": 10}; 

    for (var i=0; i<objs.length; i++) 
     if (objs[i].type == "wipe") 
      // bubblesort/bubbleswap element in objs[0] with objs[i]???? 
      // a bubble sort doesn't seem efficient though? 
} 
+0

Po prostu przekaż funkcję porównywania do natywnej funkcji '.sort'. –

+1

Kto by pomyślał, że takie proste pytanie wywołałoby taką dyskusję i zbiór na wpół wypalonych odpowiedzi na start! :) – Paul

Odpowiedz

3

array.sort metodą Javascript za spodziewa się porównać funkcji, po prostu przekazać tę funkcję:

function compareFunc(a,b) { return animPriority[a.type] - animPriority[b.type]; } 
16

To może być rozwiązanie szukasz:

objs.sort(function(a,b){ 
    var order = ["wipe", "fly", "iris", "flip", "cube", 
     "blur", "zoom", "fade", "glow", "rotate"]; 
    return order.indexOf(a.type) - order.indexOf(b.type); 
}); 

Działa dokładnie tak, jak żądano. Aby uzyskać dowód, patrz this jsfiddle.

Rozwiązanie wykorzystuje metodę sort() klasy Array, przekazując do niej wywołanie zwrotne, co pozwala na niestandardowe porównanie. W tym przypadku porównanie jest oparte na pozycji właściwości .type porównywanych elementów w tablicy order.

+0

+1 Najlepsza, najbardziej wyczerpująca odpowiedź tutaj. – zizozu

+1

Czy byłoby lepiej utworzyć taką funkcję? 'var myFunc = function (a, b) {// function body};'? Czy funkcja i tablica nie byłyby tworzone od nowa przy każdym wywołaniu sortowania za pomocą twojego przykładu? – Paul

+1

@Paul: Bez urazy, ale pomyśl o tym przez chwilę :) Wszystko zależy od tego, jak go używasz, a odpowiedź na twoje pytanie jest bardziej złożona. Ważne są tutaj: 1) zamknięcia (gdzie dostępna jest funkcja 'myFunc'/anonymous), 2) ile razy' tablica objs' będzie sortowana, 3) czy zależy Ci na zanieczyszczaniu przestrzeni nazw. W zależności od tego, w jaki sposób i gdzie przypisujesz funkcję do 'myFunc', odpowiedź jest inna. – Tadeck

3

Jest to dość proste w JavaScript:

pierwsze, umieścić swoje obiekty w tablicy, na przykład myArray.

Następnie należy napisać funkcję, która pobiera obiekty i zwraca wartość mniejszą od 0, jeśli pierwszy obiekt powinien pojawić się przed drugim obiektem w tablicy, 0, jeśli dwa obiekty są równe dla celów sortowania lub wartość większa niż 0, jeśli drugi obiekt powinien pojawić się przed pierwszym obiektem w tablicy. Na przykład:

function myOrderFunc(a, b) 
{ 
    // if a should come before b, return a negative value 
    // if b should come before a, return a positive value 
    // if they are equally ranked in the sort order, return 0 
} 

Na koniec zadzwoń pod numer myArray.sort(myOrderFunc). Spowoduje to posortowanie obiektów w miejscu w twojej tablicy. Jeśli potrzebujesz bardziej szczegółowego przykładu z użyciem konkretnych danych, zapytaj.

Powiązane problemy