2011-08-23 8 views
18

que tiene una matriz de objetos de la siguiente forma:Javascript función de comparación de ordenación personalizada - ordenar una matriz ordenada

arr[0] = { 'item1' : 1234, 'item2' : 'a string' }; 

puedo ordenar primero por 'item1' que es sencillo. Ahora quiero ordenar arr (que está ordenada por 'item1') de nuevo, pero esta vez por 'item2' pero solo para los elementos donde 'item1' es el mismo. La matriz final tendría el siguiente aspecto:

arr = [ 
    { 'item1' : 1234, 'item2' : 'apple' }, 
    { 'item1' : 1234, 'item2' : 'banana' }, 
    { 'item1' : 1234, 'item2' : 'custard' }, 
    { 'item1' : 2156, 'item2' : 'melon' }, 
    { 'item1' : 4345, 'item2' : 'asparagus' } 
]; 

Traté de escribir una función de clasificación para el segundo caso de este modo:

arr.sort(function(a,b){ 
    if(a.item1 === b.item1){ 
    return a.item2 > b.item2 ? 1 : a.item2 < b.item2 : -1 : 0; 
    } 
}); 

podría combinar los dos tipos en una función para obtener la matriz ordenada definitiva pero habrá casos en los que tendré que ordenar por 'item1' o simplemente 'item2'.

+0

si se las arregló para ordenar por elemento1, elemento2, y dos de ellos, entonces, ¿qué lo preguntas exactamente? –

+0

Así que es como escribir un patrón de decorador donde digo "new sortByItem2 (new sortByItem1 (arr))". También quiero usarlo como sortByItem1 (arr) o sortByItem2 (arr) o "new sortByItem1 (new sortByItem2 (arr))" – fenderplayer

Respuesta

26

Puede tener cuatro funciones de comparación diferentes: una clasificación por ítem1, una por ítem2, una por ítem1 luego ítem2 y una por ítem2 luego ítem1.

ej .:

arr.sort(function(a,b){ 
    if(a.item1 == b.item1){ 
    return a.item2 > b.item2 ? 1 : a.item2 < b.item2 ? -1 : 0; 
    } 

    return a.item1 > b.item1 ? 1 : -1; 
}); 
+0

que es genial cómo uno puede usar comparadores en funciones de ordenamiento en javascript. – cyan

Cuestiones relacionadas