2010-05-08 22 views
7

Mam tablicę z tablicami, w której chcę sortować zewnętrzne tablice na podstawie wartości w określonej kolumnie w środku.sortuj tablicę zewnętrzną na podstawie wartości w wewnętrznej tablicy, javascript

Założę się, że brzmiało to bardziej niż trochę mylące, więc przejdę od razu do przykładu.

dane początkowe:

var data = [ 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

sortowanie danych w oparciu o indeks kolumny 1

data.sortFuncOfSomeKind(1); 

gdzie obiekt następnie będzie wyglądać następująco;

var data = [ 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ], 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ] 
]; 

sortowanie danych, opartych na kolumnie o indeksie 2

data.sortFuncOfSomeKind(2); 

gdzie obiekt wtedy wyglądać następująco;

var data = [ 
    [ 
    "row_m-col1", 
    "3-row_m-col2", 
    "a-row_m-coln" 
    ], 
    [ 
    "row_2-col1", 
    "1-row_2-col2", 
    "b-row_2-coln" 
    ], 
    [ 
    "row_1-col1", 
    "2-row_1-col2", 
    "c-row_1-coln" 
    ] 
]; 

Dużą Q

Czy istnieje istniejące rozwiązanie do tego, że znasz, albo będę musiał napisać samodzielnie? Jeśli tak, to który algorytm jest najłatwiejszy w użyciu? Szybkie sortowanie?

_L

+2

możliwe duplikat [sortowania przedmiotów w macierzy przez wartości pola w JavaScript] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array- by-a-field-value- in-javascript), [JavaScript: Jak sortować tablicę rekordów według wartości w jednym z pól?] (http://stackoverflow.com/questions/1689679/javascript-how-to-sort-an-array-of -records-by-values-in-one-of-field) – outis

Odpowiedz

8

(patrz sekcja 15.4.4.11 z the spec lub MDC) akceptuje opcjonalny parametr funkcyjny, który zostanie użyty do porównania dwóch pozycji do celów sortowania. Funkcja powinna zwrócić -1, jeśli pierwszy argument jest "mniejszy niż" drugi, 0 jeśli są równe, lub 1, jeśli pierwszy jest "większy niż" drugi. Więc:

outerArray.sort(function(a, b) { 
    var valueA, valueB; 

    valueA = a[1]; // Where 1 is your index, from your example 
    valueB = b[1]; 
    if (valueA < valueB) { 
     return -1; 
    } 
    else if (valueA > valueB) { 
     return 1; 
    } 
    return 0; 
}); 

(Można oczywiście kompresować że kod trochę; ja trzymał go gadatliwy dla jasności).

1

Tu kiedyś implementację sortowania, który zwrócony wynik prostego x<y porównania. To rozwiązanie jest niezainteresowane, a ten post zostaje tylko po to, aby zachować dyskusję.

+0

D'oh. Nie wiedziałem, że możesz po prostu zwrócić x [a]> y [a] dla takiej wartości porównania. To pozwoli mi zaoszczędzić kilka linijek kodu. – awgy

+0

@David: Wracasz 'true' lub' false'. Musisz zwrócić -1, 0 lub 1. (Sprawdziłem, na wypadek, gdyby istniało jakieś Naprawdę fajne Thing, którego mi brakowało, ale powyższe nie udało się poprawnie posortować we wszystkich przypadkach.) –

+0

@awgy: Nie możesz: http: // pastie.org/951302 –

4

Oto rozwiązanie nie potrzebuje oddzielnej zmiennej zawierać indeks

var arr = [.....] 
arr.sort((function(index){ 
    return function(a, b){ 
     return (a[index] === b[index] ? 0 : (a[index] < b[index] ? -1 : 1)); 
    }; 
})(2)); // 2 is the index 

Te rodzaje o indeksie 2

+1

Powinieneś zmienić to '=' na '==='. Porównania nie lubią być mylone z zadaniami. – awgy

+0

Cóż, zmień go na '==' lub '===' w zależności od Twoich potrzeb. –

+0

yep, tam mały błąd - naprawiony teraz –

Powiązane problemy