2010-11-19 11 views
16

Ich habe für eine Weile suchen ein JSON-Objekt zu sortieren wie dieseSortierung ein JSON-Objekt in 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", 
    } 
]} 

alphabetisch nach Wert von „COMMERCIALNAME_E“

{"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", 
    } 
]} 

ich kann‘bekommen t finden Sie keinen Code, der dies tun wird. Kann mir jemand Hilfe geben?

+0

sortieren, was ... wie definiert werden? – Alex

+1

ctrl + K ist dein Freund. Verwenden Sie es beim Buchen von Code. –

Antwort

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

AKTUALISIERT: NICHT mutieren

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

Ja, es gibt keine "einfache" Lösung für die Sortierung von JSON. Aber es ist eine Lösung ... Du bist so gut. –

+0

danke aktualisiert, für testbaren code, harness power der funktionalen programmierung Ich nicht mehr mutieren args in meinen Funktionen. – PDA

1

Sie können keine JSON-Zeichenfolge sortieren. JSON ist eine Objektnotation für den Datentransport - dh eine Zeichenfolge. Sie müssen es als Objektliteral (z. B. mit eval) auswerten und alle gewünschten Änderungen vornehmen, bevor Sie es erneut initialisieren.

8

Erster Extrakt der JSON codierten Daten:

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

Dann Art mit einer benutzerdefinierten (Benutzer) Funktion:

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

nahm ich an Sie von OBJECTID sortieren wollten, aber Sie können es ändern nach allem sortieren.

+0

Es sollte Kleinbuchstaben sein ** b. ** in Aussagen +1 –

3

Sie können ein geordnetes Array von allem sortieren, indem Sie eine benutzerdefinierte Vergleichsfunktion als Parameter für Array.Sort() bereitstellen.

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

Extrahieren der JSON aus dem String

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

Sortierung eine benutzerdefinierte Funktion vorbei Methode

results.sort(customfunction); 
zu sortieren

benutzerdefinierte Funktion kann als

function customfunction(a, b) { 

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

}

Verwandte Themen