排序JSON对象的Javascript
我一直在寻找一段时间解决这样排序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",
}
]}
我可以”找到任何将执行此操作的代码。任何人都可以给我一些帮助吗?
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);
是的,没有“简单”的排序json的解决方案。但它是一个解决方案......你是如此的好。 – 2015-11-12 14:41:59
感谢您更新了可测试代码,利用函数式编程的强大功能,我不再改变函数中的参数。 – PDA 2017-05-31 17:08:19
您无法对JSON字符串进行排序。JSON是数据传输的对象符号 - 即字符串。您必须将其评估为对象字面值(例如,使用eval),并在重新进行串行化之前进行所需的任何更改。
先提取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
进行排序,但你可以改变它按任何东西排序。
它应该是小写** b。**在语句+1 – 2017-11-10 18:13:34
您可以通过提供自定义比较函数作为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;
}
});
从一个字符串中提取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;
}
排序什么...怎么样? – Alex 2010-11-19 06:39:15
ctrl + K是你的朋友。发布代码时使用它。 – 2010-11-19 06:40:17