2010-07-12 11 views
9

Tengo un objeto JSON que primero quiero ordenar por una clave, luego por una segunda clave similar a ordenar por dos columnas en SQL. Este es un ejemplo de la JSON Tendría:¿Cómo pedir un objeto JSON con dos teclas?

{ 
    "GROUPID":3169675, 
    "LASTNAME":"Chantry" 
} 

quisiera ordenar todos los resultados por el GROUPID y luego por LASTNAME. He usado la función de ordenamiento JSON para ordenar por una clave pero no múltiple.

Cualquier ayuda sería genial.

+1

Su ejemplo es para un hash de propiedades de objetos. Por definición, estos no están ordenados. ¿Supongo que tiene una matriz de estos objetos por los que desea ordenar? –

+0

¿Es una matriz de objetos JSON? – Castrohenge

Respuesta

9

Suponiendo que haya un arreglo de objetos:

var data = [ 
    { "GROUPID":3169675, "LASTNAME":"Chantry" }, 
    { "GROUPID":3169612, "LASTNAME":"Doe" }, 
    ... 
]; 

Se puede utilizar un comparador personalizado para realizar la ordenación. Para ordenar primero por GROUPID, y luego por LASTNAME, la lógica para comparar dos objetos sería:

if GROUPID of first is smaller than second 
    return -1; 
else if GROUPID of first is larger than second 
    return 1; 
else if LASTNAME of first is smaller than second 
    return -1; 
else if LASTNAME of first is larger than second 
    return 1; 
else 
    return 0; 

para ordenar la matriz objeto, utilice el algoritmo anterior y llama al método de ordenación en la matriz. Después de realizar la clasificación, data debe tener los elementos en orden ordenado requerido.

data.sort(function(a, b) { 
    // compare a and b here using the above algorithm 
}); 

Aquí hay otra muy muy similar question que contesté recientemente. Se trata de ordenar columnas múltiples usando jQuery, pero puedes quitar la parte jQuery fácilmente. Presenta algunos enfoques personalizables que pueden extenderse a múltiples columnas.

+0

¿Por qué no comparas una matriz de claves? Hace que el género sea más genérico o extraño algo? Ver mi respuesta a continuación. – Mic

+0

@Mic: eso es exactamente lo que estoy haciendo en la respuesta vinculada. No quería volver a escribir todo de nuevo, así que simplemente agregué un enlace a él. – Anurag

36

Aquí es una forma genérica para ordenar una serie de objetos, con varias columnas:

var arr = [ 
    { id:5, name:"Name3" }, 
    { id:4, name:"Name1" }, 
    { id:6, name:"Name2" }, 
    { id:3, name:"Name2" } 
], 

// generic comparison function 
cmp = function(x, y){ 
    return x > y ? 1 : x < y ? -1 : 0; 
}; 

//sort name ascending then id descending 
arr.sort(function(a, b){ 
    //note the minus before -cmp, for descending order 
    return cmp( 
     [cmp(a.name, b.name), -cmp(a.id, b.id)], 
     [cmp(b.name, a.name), -cmp(b.id, a.id)] 
    ); 
}); 

Para añadir otras columnas para ordenar, puede agregar otros elementos en la comparación matriz.

arr.sort(function(a, b){ 
    return cmp( 
     [cmp(a.name, b.name), -cmp(a.id, b.id), cmp(a.other, b.other), ...], 
     [cmp(b.name, a.name), -cmp(b.id, a.id), cmp(b.other, a.other), ...] 
    ); 
}); 

EDITAR: por @PhilipZ comentario a continuación, la comparación de matriz en JS ellos convertir en cadenas separadas por comas.

+4

Ojalá pudiera darte un montón de votos acumulados ... – Alex

+1

Uno para esta respuesta es suficiente;) Me alegra ver que te ayudó! – Mic

+0

Pregunta ¿Por qué las matrices? ¿Por qué no simplemente '(a.name - b.name) \t || (a.id - b.id) ' Y puede continuar como: ' (a.name - b.name) \t || (a.id - b.id) || (a.idd - b.idd) ' –

Cuestiones relacionadas