2010-11-19 138 views
16

我一直在寻找一段时间解决这样排序JSON对象的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", 
    } 
]} 

按字母顺序“COMMERCIALNAME_E”价值的JSON对象来获取

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

我可以”找到任何将执行此操作的代码。任何人都可以给我一些帮助吗?

+0

排序什么...怎么样? – Alex 2010-11-19 06:39:15

+1

ctrl + K是你的朋友。发布代码时使用它。 – 2010-11-19 06:40:17

回答

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

更新:不要变异

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

是的,没有“简单”的排序json的解决方案。但它是一个解决方案......你是如此的好。 – 2015-11-12 14:41:59

+0

感谢您更新了可测试代码,利用函数式编程的强大功能,我不再改变函数中的参数。 – PDA 2017-05-31 17:08:19

1

您无法对JSON字符串进行排序。JSON是数据传输的对象符号 - 即字符串。您必须将其评估为对象字面值(例如,使用eval),并在重新进行串行化之前进行所需的任何更改。

8

先提取JSON编码的数据:

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

然后排序与自定义(用户)功能:

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

我假设你想通过OBJECTID进行排序,但你可以改变它按任何东西排序。

+0

它应该是小写** b。**在语句+1 – 2017-11-10 18:13:34

3

您可以通过提供自定义比较函数作为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

从一个字符串中提取JSON

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

排序方式传递一个自定义函数来进行排序的方法

results.sort(customfunction); 

自定义函数可以被定义为

function customfunction(a, b) { 

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

}