2010-05-08 13 views
7

Ho una matrice con array al suo interno, in cui voglio ordinare gli array esterni in base ai valori in una colonna specifica all'interno.ordinamento matrice esterna basata su valori nell'array interno, javascript

Scommetto che suonava più di un po 'di confusione, quindi salterò dritto a un esempio.

dati iniziali:

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" 
    ] 
]; 

Ordinare i dati, sulla base di colonna con indice 1

data.sortFuncOfSomeKind(1); 

in cui l'oggetto poi sarebbe simile a questa;

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" 
    ] 
]; 

Ordinare i dati, basati su colonna con indice 2

data.sortFuncOfSomeKind(2); 

in cui l'oggetto poi sarebbe simile a questa;

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" 
    ] 
]; 

La grande Q

C'è una soluzione esistente per questo che si sa, o dovrebbe devo scrivere uno io? Se sì, quale sarebbe l'algoritmo di ordinamento più semplice da usare? QuickSort?

_L

+2

possibile duplicato [oggetti ordinamento in una matrice da un valore di campo in JavaScript] (http://stackoverflow.com/questions/1129216/sorting-objects-in-an-array- by-a-field-valore- in-javascript), [Javascript: come ordinare un array di record in base ai valori in uno dei campi?] (http://stackoverflow.com/questions/1689679/javascript-how-to-sort-an-array-of -records-by-values-in-one-of-the-fields) – outis

risposta

8

Array#sort (vedere la sezione 15.4.4.11 di the spec o MDC) accetta un parametro di funzione facoltativo che verrà utilizzato per confrontare due voci per scopi di ordinamento. La funzione dovrebbe restituire -1 se il primo argomento è "minore di" il secondo, 0 se sono uguali, o 1 se il primo è "maggiore di" il secondo. Quindi:

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; 
}); 

(ovviamente è possibile comprimere il codice un po ', ho mantenuto lo verbose per chiarezza.)

1

Qui usato per essere un'implementazione sorta che ha restituito il risultato di un semplice confronto x<y. Questa soluzione è disincentivata e questo post è lasciato solo per preservare la discussione che ne segue.

+0

D'oh. Non sapevo che potresti semplicemente restituire x [a]> y [a] per un valore di confronto come quello. Mi salverò qualche riga di codice. – awgy

+0

@David: stai restituendo 'true' o' false'. Devi restituire -1, 0 o 1. (Ho controllato, nel caso ci fosse qualche cosa veramente cool che mi mancava, ma il sopra non riesce a ordinare correttamente in tutti i casi.) –

+0

@awgy: Non puoi: http: // pastie.org/951302 –

4

Ecco una soluzione non aver bisogno di una variabile separata per contenere l'indice

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 

Questo tipo di indice 2

+1

Dovresti cambiare '=' a '==='. Ai paragoni non piace essere scambiati per incarichi. – awgy

+0

Bene, cambialo in '==' o '===' a seconda delle esigenze. –

+0

sì, un piccolo bug lì - risolto ora –

Problemi correlati