2012-06-19 15 views
17

ho scoperto come ordinare un array di JSON in http://www.devcurry.com/2010/05/sorting-json-array.htmlmodo generico di ordinamento di matrice JSON per attributo

Ora voglio ordinare in modo generico; in modo che la mia funzione di ordinamento sappia quale attributo ordinare.

Per esempio se il mio array è

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

voglio evitare di scrivere diverso se i casi di sapere se devo ordinare per nome o l'età. Voglio solo passare un parametro 'nome' o 'età' e la mia funzione di ordinamento dovrebbe sapere cosa fare.

Grazie.

+0

Quindi hai provato qualcosa? A proposito, l'articolo che hai linkato e quello che effettivamente vuoi fare non hanno nulla a che fare con JSON; stai manipolando le normali strutture di dati di Javascript, mentre [JSON] (http://json.org) è una serializzazione a stringa di tali strutture. – lanzz

+1

hai ragione. Non ho formulato correttamente la domanda. – userPassingBy

risposta

64

Qualcosa come 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

Grazie mille! :) – userPassingBy

+0

@Engineer: è questo currying? Bello anche se + 1 – Anand

+0

bello. demysitfied :) – 1Mayur

4

vedere questo esempio http://jsfiddle.net/W8Byu/1/

Quello che ho fatto è memorizzato il tipo colonna Nome in una variabile e utilizzato in funzione Sort.

var sortColumnName = "Name"; 

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

grazie per la tua risposta. – userPassingBy

4

È possibile ordinare le matrici da tutto il campo con Alasql libreria:

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

Prova questo esempio in jsFiddle.

Problemi correlati