0

早上好,我在弄清楚如何对以下 JSON 进行排序时遇到问题

{
    "135": {"name": "marco", "title": "foo"},
    "223": {"name": "wilco", "title": "bar"},
    "322": {"name": "enola", "title": "baz"}
}

我希望按名称排序(有时,可能的标题。但是应该对整行进行排序。我应该先将其转换为正确的数组吗?

谢谢!

4

4 回答 4

3

我应该先将其转换为正确的数组吗?

是的,因为对象不保证顺序。此外,您必须稍微修改结构:

[
    {"id":"135", "name": "marco", "title": "foo"},
    {"id":"223", "name": "wilco", "title": "bar"},
    {"id":"322", "name": "enola", "title": "baz"}
]

至于排序算法,网上有很多,尤其是这个

于 2012-10-10T07:36:44.923 回答
1

您可能想查看下划线,这会使您更轻松地处理对象/数组。是的,你需要把它做成一个数组,这样你甚至可以有一个可靠的顺序/排序它。

var array=[];
for (var i in obj){
    if (obj.hasOwnProperty(i)){
        obj[i].id=i;
        array.push(obj[i]);
    }
}
var fieldToSort="id"; //or "title" or "name"
array.sort(function(a,b){
    return a[fieldToSort] - b[fieldToSort];
});
于 2012-10-10T07:43:33.373 回答
1

您永远无法对对象进行排序。您需要将其转换为数组。

如果您无法将对象更改为数组,则对于此特定问题。

你可以按照这个,

var obj = { 
    "223": {"name": "wilco", "title": "bar"},
    "322": {"name": "enola", "title": "baz"},
    "135": {"name": "marco", "title": "foo"}
};

var arr = [];
for(var i in obj) {
    var o = {};
    if(obj.hasOwnProperty(i)) {
       o.id = i;
       o.name = obj[i].name;
       o.title = obj[i].title;
       arr.push(o); 
    }        
} 
arr.sort(function (a,b) {
   a.id - b.id;
});
console.log(arr);

​<a href="http://jsfiddle.net/jashwant/54GjU/" rel="nofollow">演示

于 2012-10-10T08:01:01.887 回答
1

您可以尝试在不创建数组的情况下对对象道具进行排序,但这会花费您编写更多代码行,并且您必须注意您的属性,因此它们不会从其他对象继承。所以你必须在循环中使用:

for (var prop in obj) {
  if(obj.hasOwnProperty(prop)) {
    //perform sorting...
  }
}

或者您可以将对象转换为数组并通过标准 js 数组排序功能对数据进行排序:

function sortObj(obj) {
  var objToArr = [],
  prop,
  sortedObj = {};
  for (prop in obj) {
    if (obj.hasOwnProperty(prop)) {
        objToArr.push([prop, obj[prop]]);
    }
   }

 objToArr.sort(function(a, b) { return a[0] - b[0]; });
 objToArr.forEach(function (val, key) {
   sortedObj[val[0]] = sortedObj[val[1]];
 });
 return sortedObj;
}

您可以将此功能用于更复杂的对象,例如当对象的一个​​属性包含另一个对象时等。

于 2012-10-10T08:01:50.633 回答