Javascript 排序多维JSON数组

Javascript 排序多维JSON数组,javascript,json,sorting,facebook-graph-api,multidimensional-array,Javascript,Json,Sorting,Facebook Graph Api,Multidimensional Array,我有以下来自facebook graph API的数组。 我想按注释计数对其排序,就像javascript中的时间计数一样 [ { "status_id": "1", "message": "message1", "comment_info": { "comment_count": "1" }, "like_info": { "like_count": "0" }, "time": "1380046653" }, { "

我有以下来自facebook graph API的数组。 我想按注释计数对其排序,就像javascript中的时间计数一样

[
  {
   "status_id": "1",
   "message": "message1",
   "comment_info": {
     "comment_count": "1"
    },
    "like_info": {
    "like_count": "0"
   },
  "time": "1380046653"
  },
 {
  "status_id": "2",
  "message": "message2",
  "comment_info": {
   "comment_count": "2"
  },
  "like_info": {
   "like_count": "5"
  },
  "time": "1368109884"
 }
] 我写了下面的函数

function sortResults(prop, asc) {
 statusString = statusString.sort(function(a, b) {
    if (asc) return (a[prop] > b[prop]) ? 1 : ((a[prop] < b[prop]) ? -1 : 0);
    else return (b[prop] > a[prop]) ? 1 : ((b[prop] < a[prop]) ? -1 : 0);
 });
 console.log(statusString);
}

但是它的排序很奇怪。

您可能需要使用native[]中的排序函数

[]排序(比较函数) 示例来自:


您的函数没有考虑多维排序,它需要访问嵌套数组的deep属性。 下面是一个工作示例


假设您在排序中的顺序与您提到的相同:

var arr = [{"status_id":"1","message":"message1","comment_info":{"comment_count":"1"},"like_info":{"like_count":"0"},"time":"1380046653"},{"status_id":"2","message":"message2","comment_info":{"comment_count":"2"},"like_info":{"like_count":"5"},"time":"1368109884"}];
arr.sort(function (a, b) {
    var countA = parseInt(a["comment_info"]["comment_count"]);
    var countB = parseInt(b["comment_info"]["comment_count"]);

    var likeCountA = parseInt(a["like_info"]["like_count"]);
    var likeCountB = parseInt(b["like_info"]["like_count"]);

    var timeA = a["time"];
    var timeB = b["time"];

    return ((countA - countB) || (likeCountA - likeCountB) || (timeA - timeB));
});

你明白
['comment\u info']['comment\u count']
在做什么吗?您对该代码的期望是什么?您的需求不清楚。是否要按这些属性之一进行排序?或者,当发现相等时,是否要按这些属性进行子排序?
function compare(a, b) {
  if (a is less than b by some ordering criterion)
     return -1;
  if (a is greater than b by the ordering criterion)
     return 1;
  // a must be equal to b
  return 0;
}
var jSon = [{"status_id":"1","message":"message1","comment_info":{"comment_count":"1"},"like_info":{"like_count":"0"},"time":"1380046653"},{"status_id":"2","message":"message2","comment_info":{"comment_count":"2"},"like_info":{"like_count":"5"},"time":"1368109884"}];


// Function that sorts arr Array
// by prop (handling custom Fb cases)
// in dir direction (asc/desc)
function sortJson(arr, prop, dir) {
    return arr.sort(function(a,b) {
        var propA,propB;
        if (prop == "comment_count") {
            propA = a['comment_info']['comment_count'];
            propB = b['comment_info']['comment_count'];
        } else if (prop == "like_count") {
            propA = a['like_info']['like_count'];
            propB = b['like_info']['like_count'];
        } else {
            propA = a[prop];
            propB = b[prop];
        }

        if (dir=='asc') {
            return propA - propB;
        } else {
            return propB - propA;
        }
    });
}

console.log( sortJson(jSon, 'time', 'asc') );
console.log( sortJson(jSon, 'comment_count', 'asc') );
console.log( sortJson(jSon, 'like_count', 'desc').toString() );
var arr = [{"status_id":"1","message":"message1","comment_info":{"comment_count":"1"},"like_info":{"like_count":"0"},"time":"1380046653"},{"status_id":"2","message":"message2","comment_info":{"comment_count":"2"},"like_info":{"like_count":"5"},"time":"1368109884"}];
arr.sort(function (a, b) {
    var countA = parseInt(a["comment_info"]["comment_count"]);
    var countB = parseInt(b["comment_info"]["comment_count"]);

    var likeCountA = parseInt(a["like_info"]["like_count"]);
    var likeCountB = parseInt(b["like_info"]["like_count"]);

    var timeA = a["time"];
    var timeB = b["time"];

    return ((countA - countB) || (likeCountA - likeCountB) || (timeA - timeB));
});