【问题标题】:Sort multidimensional JSON array对多维 JSON 数组进行排序
【发布时间】:2014-02-25 10:02:27
【问题描述】:

我有以下来自 facebook graph API 的数组。 我想在javascript中按comment_count、like_count、时间对其进行排序。

[
  {
   "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);
}

然后点击按钮

sortResults(['comment_info']['comment_count'], true);   

但它的排序很奇怪。

【问题讨论】:

  • 你明白['comment_info']['comment_count']在做什么吗?您对该代码的期望是什么?
  • 而且您的要求还不清楚。您想按其中的 一个 属性排序吗?或者您想在找到相等时按这些属性进行子排序?

标签: javascript json sorting facebook-graph-api multidimensional-array


【解决方案1】:

您的函数没有考虑到需要访问嵌套数组的深层属性的多维排序。 这是一个工作示例JSFIDLE link (click here)

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

【讨论】:

    【解决方案2】:

    你可能需要原生 [] 的排序功能。

    [].sort(compareFunction) 来自here 的示例:

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

    【讨论】:

      【解决方案3】:

      假设您在排序中的顺序与您提到的一样:

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

      【讨论】:

        猜你喜欢
        • 2013-09-01
        • 2010-10-13
        • 1970-01-01
        • 2011-10-29
        • 2011-10-23
        • 2012-04-22
        相关资源
        最近更新 更多