早上好,我在弄清楚如何对以下 JSON 进行排序时遇到问题
{
"135": {"name": "marco", "title": "foo"},
"223": {"name": "wilco", "title": "bar"},
"322": {"name": "enola", "title": "baz"}
}
我希望按名称排序(有时,可能的标题。但是应该对整行进行排序。我应该先将其转换为正确的数组吗?
谢谢!
早上好,我在弄清楚如何对以下 JSON 进行排序时遇到问题
{
"135": {"name": "marco", "title": "foo"},
"223": {"name": "wilco", "title": "bar"},
"322": {"name": "enola", "title": "baz"}
}
我希望按名称排序(有时,可能的标题。但是应该对整行进行排序。我应该先将其转换为正确的数组吗?
谢谢!
我应该先将其转换为正确的数组吗?
是的,因为对象不保证顺序。此外,您必须稍微修改结构:
[
{"id":"135", "name": "marco", "title": "foo"},
{"id":"223", "name": "wilco", "title": "bar"},
{"id":"322", "name": "enola", "title": "baz"}
]
至于排序算法,网上有很多,尤其是这个。
您可能想查看下划线,这会使您更轻松地处理对象/数组。是的,你需要把它做成一个数组,这样你甚至可以有一个可靠的顺序/排序它。
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];
});
您永远无法对对象进行排序。您需要将其转换为数组。
如果您无法将对象更改为数组,则对于此特定问题。
你可以按照这个,
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">演示
您可以尝试在不创建数组的情况下对对象道具进行排序,但这会花费您编写更多代码行,并且您必须注意您的属性,因此它们不会从其他对象继承。所以你必须在循环中使用:
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;
}
您可以将此功能用于更复杂的对象,例如当对象的一个属性包含另一个对象时等。