2012-06-19 7 views
17

descubrí cómo ordenar una matriz JSON en http://www.devcurry.com/2010/05/sorting-json-array.htmlforma genérica de la clasificación matriz JSON por atributos

Ahora quiero a solucionar el problema de una manera genérica; para que mi función de clasificación sepa qué atributo ordenar por.

Por ejemplo si mi matriz es

[ 
    { 
    "name": "John", 
    "age": "16" 
    }, 
    { 
    "name": "Charles", 
    "age": "26" 
    } 
] 

Quiero evitar escribir diferente si los casos para saber si debería ordenar por nombre o edad. Solo quiero pasar un parámetro 'nombre' o 'edad' y mi función de clasificación debería saber qué hacer.

Gracias.

+0

¿Has probado algo? El artículo que vinculó y lo que realmente quiere hacer no tiene nada que ver con JSON, por cierto; está manipulando estructuras de datos regulares de Javascript, mientras que [JSON] (http://json.org) es una serialización de cadenas de dichas estructuras. – lanzz

+1

tienes razón. No formulé la pregunta correctamente. – userPassingBy

Respuesta

64

Algo así como un:

function predicateBy(prop){ 
    return function(a,b){ 
     if(a[prop] > b[prop]){ 
      return 1; 
     }else if(a[prop] < b[prop]){ 
      return -1; 
     } 
     return 0; 
    } 
} 

//Usage 
yourArray.sort(predicateBy("age")); 
yourArray.sort(predicateBy("name")); 
+0

¡Muchas gracias! :) – userPassingBy

+0

@Ingeniero: ¿Esto es currying? Bueno, aunque + 1 – Anand

+0

nice one. demysitfied :) – 1Mayur

4

ver este ejemplo http://jsfiddle.net/W8Byu/1/

Lo que he hecho se almacena la columna Nombre ordenar en una variable y se utiliza en función de clasificación.

var sortColumnName = "Name"; 

function SortByName(x,y) { 
     return ((x[sortColumnName] == y[sortColumnName]) ? 0 : ((x[sortColumnName]> y[sortColumnName]) ? 1 : -1)); 
    } 
+0

gracias por su respuesta. – userPassingBy

4

Puede ordenar las matrices por cualquier campo con Alasql biblioteca:

var data = [{"name":"John", "age":"16"}, {"name":"Charles", "age":"26"}]; 

var res1 = alasql('SELECT * FROM ? ORDER BY name',[data]); 
var res2 = alasql('SELECT * FROM ? ORDER BY age',[data]); 
var res3 = alasql('SELECT * FROM ? ORDER BY age, name',[data]); 
var res4 = alasql('SELECT * FROM ? ORDER BY age DESC, name ASC',[data]); 

probar este ejemplo in jsFiddle.

Cuestiones relacionadas