2012-05-01 17 views
5

devo una serie di MyArrayOfItemsItem oggetti con oggetti che assomigliano a questo:javascript sorta di matrice raddoppiare sorta

Item 
{ 
    ContainerID: i, // int 
    ContainerName: 'SomeName', // string 
    ItemID: j, // int 
    ItemName: 'SomeOtherName' // string 
} 

voglio ordinare questo array in modo che sia allineati secondo ContainerID e poi da ItemName in ordine alfabetico.

Ho una funzione di ordinamento personalizzata che finora assomiglia a questo:

function CustomSort(a, b) { 

    Item1 = a['ContainerID']; 
    Item2 = b['ContainerID']; 

    return Item1 - Item2; 
} 

MyArrayOfItems.sort(CustomSort); 

Questa sorta di ContainerID ma come faccio poi ordina per ItemName?

Grazie.

+0

possibile duplicato del [Javascript tipo array due campi] (http://stackoverflow.com/questions/6129952/javascript-sort-array-by-two-fields) –

+0

@FelixKling: non proprio; Ho bisogno di ordinare alfabeticamente. – frenchie

+0

Quindi? Puoi facilmente confrontare le punture con '<' and '>' anche se sono d'accordo che 'localCompare' è un modo migliore. Ho pensato che la domanda generale riguardasse come ordinare in base a due proprietà, nel qual caso è chiaramente un duplicato. –

risposta

6

Utilizzare la funzione String.localeCompare. E usalo quando ContainerID di a e b sono uguali.

function CustomSort(a, b) { 
    var Item1 = a['ContainerID']; 
    var Item2 = b['ContainerID']; 
    if(Item1 != Item2){ 
     return (Item1 - Item2); 
    } 
    else{ 
     return (a.ItemName.localeCompare(b.ItemName)); 
    } 
} 

di modificare il tipo di ordinamento si può sempre mettere - di fronte a qualsiasi return espressione.

+0

LocalCompare funziona in IE8? – frenchie

+0

Dovrebbe. Come in JavaScript 1.2, che è molto vecchio. –

+0

localcompare è una buona scelta, ma come ricordo Chrome ha avuto problemi con esso ... http://code.google.com/p/v8/issues/detail? Id = 459 –

4
function CustomSort(a, b) { 

    Item1 = a['ContainerID']; 
    Item2 = b['ContainerID']; 
    if(Item1 - Item2 !=0){ 
     return Item1 - Item2; 
    } 
    else{ 
     if (a.ItemName < b.ItemName) 
     return -1; 
     if (a.ItemName > b.ItemName) 
     return 1; 
     return 0; 
    } 
} 
+0

ok, grazie; upvoted perché funziona anche. Preferisco comunque localCompare. – frenchie