按字母顺序排序JSON

时间:2011-12-07 16:47:43

标签: jquery json

我有一个基于存储在表中的数据生成的JSON对象。然后,我需要能够以不同的方式对其进行排序,但是当我JSON.stringify(array)并尝试从那里排序时它不起作用。当我尝试array.sort();时,它会改变顺序,但最终不起作用。我对JSON没有太多经验以及如何操作它所以我不知道还有什么可以尝试。排序之后,我需要按字母顺序重复使用所选类别的表格。

JSON看起来像这样:

var arr = [{
"Functional Category":"T-Shirt",
"Brand Name":"threadless",
"When Obtained":"Last 3 Months",
"How Obtained":"Purchased",
"How Often Worn":"Monthly",
"Where It's Made":"India",
"Has a Graphic":"Yes"}]

我在这里设置了一个小提琴:http://jsfiddle.net/Skooljester/88HVZ/1/我尝试了here的建议,但无法使其正常工作。

我有两个问题,一个问题:如何实现这一目标,以及两个问题:是否有更好的方法进行排序?

5 个答案:

答案 0 :(得分:7)

见下面的代码......

function sortObject(o) {
    var sorted = {},
    key, a = [];

    for (key in o) {
        if (o.hasOwnProperty(key)) {
                a.push(key);
        }
    }

    a.sort();

    for (key = 0; key < a.length; key++) {
        sorted[a[key]] = o[a[key]];
    }
    return sorted;
}

这有帮助吗?

答案 1 :(得分:6)

首先,定义一个比较函数:

function compare(el1, el2, index) {
  return el1[index] == el2[index] ? 0 : (el1[index] < el2[index] ? -1 : 1);
}

然后,要对第一列上的数组进行排序,请使用:

array.sort(function(el1,el2){
  return compare(el1, el2, "Functional Category")
});

或者,如果第一列相等,则对第一列A-Z和第二列Z-A进行排序:

array.sort(function(el1,el2){
  var compared = compare(el1, el2, "Functional Category")
  return compared == 0 ? -compare(el1, el2, "Brand Name") : compared;
});

答案 2 :(得分:5)

Mozilla开发人员文档对sort函数有一个有用的解释。您可以提供一个函数作为参数,告诉浏览器如何进行排序。

https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

来自该链接的一些伪代码,添加了myArray.sort调用并删除了函数名称:

myArray.sort(function(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;
});

编辑:看起来你有一个单元素数组,其中一个对象作为元素。物体是无序的。在对数组进行排序之前,必须将其转换为数组。试试这个(通过augment.js为旧浏览器添加Object.keys和Array.prototype.map函数):

var result = Object.keys(myArray[0]).sort().map(function(key) {
    return [key,myArray[0][key]];
});

这将为您提供一个排序的嵌套数组:

[["Brand Name","threadless"],
 ["Function Category","T-Shirt"],
 ...
]

答案 3 :(得分:2)

这种东西可能会有所帮助:

function (obj) {
   var a = [],x;
   for(x in obj){ 
     if(obj.hasOwnProperty(x)){
         a.push([x,obj[x]]);
     }
   }
   a.sort(function(a,b){ return a[0]>b[0]?1:-1; })
   return a;
}

答案 4 :(得分:1)

如果您的目的是允许用户动态地对表进行排序,那么我的方法可能略有不同。

有很多jQuery表排序插件。我在这个方面取得了很大的成功:http://tablesorter.com/docs/

允许多列排序,默认排序,连接事件等......等等......

通过这种方式,您可以按原样构建表,并且即使在页面输出之前也可以进行排序。