2011-12-07 125 views
7

Tengo un objeto JSON generado en base a datos almacenados en una tabla. Entonces necesito poder ordenarlo de diferentes maneras, pero cuando lo hago JSON.stringify(array) y trato de ordenar desde allí, no funciona. Cuando intento simplemente hacer array.sort(); cambiará el orden, pero al final no funciona. No tengo mucha experiencia con JSON y cómo operarlo, así que no estoy seguro de qué más probar. Después de ordenarlo, necesito revisar y reescribir la tabla con la categoría seleccionada en orden alfabético.Ordenar JSON alfabéticamente

El JSON se parece a esto:

var arr = [{ 
"Functional Category":"T-Shirt", 
"Brand Name":"threadless", 
"When Obtained":"Last 3 Months", 
"How Obtained":"Purchased", 
"How Often Worn":"Monthly", 
"Where It's Made":"India", 
"Has a Graphic":"Yes"}] 

Tengo una configuración violín aquí: http://jsfiddle.net/Skooljester/88HVZ/1/ y me han tratado de lo que se sugiere here pero fue incapaz de hacerlo funcionar.

Tengo dos preguntas, una: ¿cómo hago para lograr esto, y dos: hay una mejor manera de hacer la clasificación?

+4

La próxima vez, incluya el código correspondiente en la pregunta. Si jsFiddle se cae (lo que a veces ocurre), tu pregunta está incompleta. –

Respuesta

6

En primer lugar, definir una función de comparación:

function compare(el1, el2, index) { 
    return el1[index] == el2[index] ? 0 : (el1[index] < el2[index] ? -1 : 1); 
} 

Entonces, para ordenar la matriz en la primera columna, utilice la siguiente:

array.sort(function(el1,el2){ 
    return compare(el1, el2, "Functional Category") 
}); 

O, para ordenar en la primera columna AZ, y en la segunda columna ZA si la primera columna es igual:

array.sort(function(el1,el2){ 
    var compared = compare(el1, el2, "Functional Category") 
    return compared == 0 ? -compare(el1, el2, "Brand Name") : compared; 
}); 
+0

Esto funciona genial. Me encontré con un problema para imprimirlo pero lo resolví. Visto aquí: http://jsfiddle.net/Skooljester/agcUk/3/ ¡Muchas gracias! –

+1

Sí, he usado su jsfiddle anterior para probarlo, consulte http://jsfiddle.net/88HVZ/7/ – Bart

5

La documentación del desarrollador de Mozilla tiene una explicación útil de la función de ordenación. Puede proporcionar una función como parámetro que le dice al navegador cómo hacer el ordenamiento.

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

algunos pseudo-código a partir de ese enlace, con la llamada myArray.sort añadido y el nombre de la función eliminada:

myArray.sort(function(a, b) { 
    if (a is less than b by some ordering criterion) 
    return -1; 
    if (a is greater than b by the ordering criterion) 
    return 1; 
    // a must be equal to b 
    return 0; 
}); 

EDIT: Parece que tiene una matriz con un solo elemento un objeto como el elemento. Los objetos están desordenados. Tienes que transformarlo en una matriz antes de que pueda ser ordenado. Prueba esto (con los Object.keys y funciones añadidas a través de Array.prototype.map augment.js para navegadores antiguos):

var result = Object.keys(myArray[0]).sort().map(function(key) { 
    return [key,myArray[0][key]]; 
}); 

Esto le dará una ordenados, matriz anidada de la forma:

[["Brand Name","threadless"], 
["Function Category","T-Shirt"], 
... 
] 
+0

Lo he visto pero no he podido encontrar la manera de implementarlo. –

2

algo de este tipo podría ser de ayuda:

 
function (obj) { 
    var a = [],x; 
    for(x in obj){ 
    if(obj.hasOwnProperty(x)){ 
     a.push([x,obj[x]]); 
    } 
    } 
    a.sort(function(a,b){ return a[0]>b[0]?1:-1; }) 
    return a; 
} 

6

véase a continuación código ....

function sortObject(o) { 
    var sorted = {}, 
    key, a = []; 

    for (key in o) { 
     if (o.hasOwnProperty(key)) { 
       a.push(key); 
     } 
    } 

    a.sort(); 

    for (key = 0; key < a.length; key++) { 
     sorted[a[key]] = o[a[key]]; 
    } 
    return sorted; 
} 

¿Eso ayuda?

+0

Por favor, disculpe mi falta de experiencia, pero al tratar de implementar el código, que no funciona como se esperaba http://jsfiddle.net/Skooljester/WtDTD/1/ –

+1

Esto romperá el V8 de teclas numéricas: http: // code.google.com/p/v8/issues/detail?id=164 –

+0

@MANISH LANGA, +1 ¡Gran función! Esta sería la respuesta correcta, en mi opinión. :-) –

1

Si su intención es permitir al usuario ordenar la tabla dinámicamente, entonces mi enfoque puede ser ligeramente diferente.

Hay muchos plugins de clasificación de tablas jQuery. He tenido buen éxito con éste: http://tablesorter.com/docs/

Permite ordenar varias columnas, una especie de forma predeterminada, alambre hasta eventos, etc ... etc ...

De esta manera usted puede construir su tabla a medida que ya están, y la clasificación puede hacerse secundaria incluso antes de la salida de la página.

+0

Esa es la intención correcta. Sin embargo, como todavía estoy aprendiendo javascript/jQuery, estoy tratando de ordenarlo sin usar un complemento. –

Cuestiones relacionadas