2010-11-19 25 views
16

He estado buscando por un tiempo para ordenar un objeto JSON como estoOrdenación de un objeto JSON en Javascript

{"results": [ 
    { 
    "layerId": 5, 
    "layerName": "Pharmaceutical Entities", 
    "attributes": { 
     "OBJECTID": "35", 
     "FACILITYTYPE": "Pharmacy", 
     "FACILITYSUBTYPE": "24 Hr Pharmacy", 
     "COMMERCIALNAME_E": "SADD MAARAB PHARMACY", 
     }, 
    "geometryType": "esriGeometryPoint", 
    }, 
    { 
    "layerId": 5, 
    "layerName": "Pharmaceutical Entities", 
    "attributes": { 
     "OBJECTID": "1", 
     "FACILITYTYPE": "Pharmacy", 
     "FACILITYSUBTYPE": "24 Hr Pharmacy", 
     "COMMERCIALNAME_E": "GAYATHY HOSPITAL PHARMACY", 

    }, 
    "geometryType": "esriGeometryPoint", 
    }, 
    { 
    "layerId": 5, 
    "layerName": "Pharmaceutical Entities", 
    "attributes": { 
     "OBJECTID": "255", 
     "FACILITYTYPE": "Pharmacy", 
     "FACILITYSUBTYPE": "24 Hr Pharmacy", 
     "COMMERCIALNAME_E": "AL DEWAN PHARMACY", 
     }, 
    "geometryType": "esriGeometryPoint", 
    } 
]} 

alfabéticamente por el valor de "COMMERCIALNAME_E" para obtener

{"results": [ 
    { 
    "layerId": 5, 
    "layerName": "Pharmaceutical Entities", 
    "attributes": { 
     "OBJECTID": "255", 
     "FACILITYTYPE": "Pharmacy", 
     "FACILITYSUBTYPE": "24 Hr Pharmacy", 
     "COMMERCIALNAME_E": "AL DEWAN PHARMACY", 
     }, 
    "geometryType": "esriGeometryPoint", 
    }, 
    { 
    "layerId": 5, 
    "layerName": "Pharmaceutical Entities", 
    "attributes": { 
     "OBJECTID": "1", 
     "FACILITYTYPE": "Pharmacy", 
     "FACILITYSUBTYPE": "24 Hr Pharmacy", 
     "COMMERCIALNAME_E": "GAYATHY HOSPITAL PHARMACY", 
     }, 
    "geometryType": "esriGeometryPoint", 
    }, 
    { 
    "layerId": 5, 
    "layerName": "Pharmaceutical Entities", 
    "attributes": { 
     "OBJECTID": "35", 
     "FACILITYTYPE": "Pharmacy", 
     "FACILITYSUBTYPE": "24 Hr Pharmacy", 
     "COMMERCIALNAME_E": "SADD MAARAB PHARMACY", 
     }, 
    "geometryType": "esriGeometryPoint", 
    } 
]} 

lo que pueda' t encuentra cualquier código que haga esto. ¿Alguien puede darme algo de ayuda?

+0

especie lo que ... ¿cómo? – Alex

+1

ctrl + K es tu amigo. Úselo cuando publique código. –

Respuesta

35
function sortJsonArrayByProperty(objArray, prop, direction){ 
    if (arguments.length<2) throw new Error("sortJsonArrayByProp requires 2 arguments"); 
    var direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending 

    if (objArray && objArray.constructor===Array){ 
     var propPath = (prop.constructor===Array) ? prop : prop.split("."); 
     objArray.sort(function(a,b){ 
      for (var p in propPath){ 
       if (a[propPath[p]] && b[propPath[p]]){ 
        a = a[propPath[p]]; 
        b = b[propPath[p]]; 
       } 
      } 
      // convert numeric strings to integers 
      a = a.match(/^\d+$/) ? +a : a; 
      b = b.match(/^\d+$/) ? +b : b; 
      return ((a < b) ? -1*direct : ((a > b) ? 1*direct : 0)); 
     }); 
    } 
} 

sortJsonArrayByProperty(results, 'attributes.OBJECTID'); 
sortJsonArrayByProperty(results, 'attributes.OBJECTID', -1); 

ACTUALIZADO: NO mutar

function sortByProperty(objArray, prop, direction){ 
    if (arguments.length<2) throw new Error("ARRAY, AND OBJECT PROPERTY MINIMUM ARGUMENTS, OPTIONAL DIRECTION"); 
    if (!Array.isArray(objArray)) throw new Error("FIRST ARGUMENT NOT AN ARRAY"); 
    const clone = objArray.slice(0); 
    const direct = arguments.length>2 ? arguments[2] : 1; //Default to ascending 
    const propPath = (prop.constructor===Array) ? prop : prop.split("."); 
    clone.sort(function(a,b){ 
     for (let p in propPath){ 
       if (a[propPath[p]] && b[propPath[p]]){ 
        a = a[propPath[p]]; 
        b = b[propPath[p]]; 
       } 
     } 
     // convert numeric strings to integers 
     a = a.match(/^\d+$/) ? +a : a; 
     b = b.match(/^\d+$/) ? +b : b; 
     return ((a < b) ? -1*direct : ((a > b) ? 1*direct : 0)); 
    }); 
    return clone; 
} 

const resultsByObjectId = sortByProperty(results, 'attributes.OBJECTID'); 
const resultsByObjectIdDescending = sortByProperty(results, 'attributes.OBJECTID', -1); 
+0

Sí, no existe una solución "fácil" para ordenar json. Pero hay una solución ... Eres tan bueno. –

+0

gracias actualizado, para el código de prueba, aprovechar la potencia de la programación funcional ya no mudo args en mis funciones. – PDA

1

No se puede ordenar una cadena JSON .. JSON es una notación de objetos para el transporte de datos, es decir, una cadena. Deberá evaluarlo como un objeto literal (por ejemplo, con eval) y hacer los cambios que desee antes de reserminarlo.

8

primer extracto de los datos JSON codificado:

var data = eval(yourJSONString); 
var results = data['results']; 

A continuación, un género con una función personalizada (usuario):

results.sort(function(a,b){ 
    //return a.attributes.OBJECTID - b.attributes.OBJECTID; 
    if(a.attributes.OBJECTID == b.attributes.OBJECTID) 
     return 0; 
    if(a.attributes.OBJECTID < b.attributes.OBJECTID) 
     return -1; 
    if(a.attributes.OBJECTID > b.attributes.OBJECTID) 
     return 1; 
}); 

Supuse que quería para ordenar por OBJECTID, pero se puede cambiar para ordenar por cualquier cosa.

+0

Debe estar en minúscula ** b. ** en las declaraciones +1 –

3

puede ordenar una matriz ordenada de cualquier cosa proporcionando una función de comparación personalizada como parámetro a Array.Sort().

var myObject = /* json object from string */ ; 

myObject.results.sort(function (a, b) { 

    // a and b will be two instances of your object from your list 

    // possible return values 
    var a1st = -1; // negative value means left item should appear first 
    var b1st = 1; // positive value means right item should appear first 
    var equal = 0; // zero means objects are equal 

    // compare your object's property values and determine their order 
    if (b.attributes.COMMERCIALNAME_E < a.attributes.COMMERCIALNAME_E) { 
     return b1st; 
    } 
    else if (a.attributes.COMMERCIALNAME_E < b.attributes.COMMERCIALNAME_E) { 
     return a1st; 
    } 
    else { 
     return equal; 
    } 
}); 
0

Extraer el JSON de la cadena

var data = eval(given_JSON_string); 
var results = data['results']; 

Ordenar por pasar una función personalizada para ordenar método

results.sort(customfunction); 

función personalizada se puede definir como

function customfunction(a, b) { 

return a.attributes.COMMERCIALNAME_E < b.attributes.COMMERCIALNAME_E ? 1 : -1; 

}

Cuestiones relacionadas