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