2012-05-01 18 views
5

que tienen una serie de MyArrayOfItemsItem objetos con los objetos que se ven así:Javascript matriz doble sort

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

que desea ordenar esta matriz para que quede ordenadas según la ContainerID y luego por ItemName alfabéticamente.

que tienen una función de ordenación personalizada que hasta ahora se ve así:

function CustomSort(a, b) { 

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

    return Item1 - Item2; 
} 

MyArrayOfItems.sort(CustomSort); 

Este tipo de ContainerId pero ¿cómo puedo entonces ordenar por NombreDeElemento?

Gracias.

+0

posible duplicado de [gama especie Javascript por dos campos] (http://stackoverflow.com/questions/6129952/javascript-sort-array-by-two-fields) –

+0

@FelixKling: en realidad no; Lo necesito para ordenar alfabéticamente. – frenchie

+0

Entonces? Puedes comparar fácilmente las picaduras con '<' and '>' aunque estoy de acuerdo en que 'localCompare' es una mejor manera. Pensé que la pregunta general era sobre cómo clasificar por dos propiedades, en cuyo caso es claramente un duplicado. –

Respuesta

6

Utilice la función String.localeCompare. Y úselo cuando ContainerID de a y b son iguales.

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

para modificar el orden de clasificación siempre se puede poner - delante de cualquier return expresión.

+0

¿Funciona localCompare en IE8? – frenchie

+0

Debería. Como es en JavaScript 1.2 que es muy viejo. –

+0

localcompare es una buena opción, pero como recuerdo, Chrome tuvo problemas con ella ...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

bien, gracias; upvoted porque también funciona. Aunque prefiero localeCompare. – frenchie