我一直在寻找一段时间,想要一种方法来对这样的Javascript对象进行排序:
{
method: 'artist.getInfo',
artist: 'Green Day',
format: 'json',
api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
}
并按名称按字母顺序排序:
{
api_key: 'fa3af76b9396d0091c9c41ebe3c63716',
artist: 'Green Day',
format: 'json',
method: 'artist.getInfo'
}
我找不到任何可以执行此操作的代码。谁能给我一些帮助?
答案 0 :(得分:83)
根据定义,order of keys in an object is undefined,因此您可能无法以面向未来的方式执行此操作。相反,您应该考虑在实际向用户显示对象时对这些键进行排序。无论如何,它在内部使用的排序顺序并不重要。
按照惯例,大多数浏览器将按照添加顺序保留对象中键的顺序。所以,你可以做到这一点,但不要指望它总是有效:
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 :(得分:12)
此函数接受一个对象并返回[key,value]
形式的排序数组function (o) {
var a = [],i;
for(i in o){
if(o.hasOwnProperty(i)){
a.push([i,o[i]]);
}
}
a.sort(function(a,b){ return a[0]>b[0]?1:-1; })
return a;
}
对象数据结构没有明确定义的顺序。在数学术语中,对象中的键集合是无序集合,应该这样处理。 如果要定义顺序,则应该使用数组,因为具有顺序的数组是您可以依赖的假设。具有某种顺序的对象是留给实现的奇思妙想的东西。
答案 2 :(得分:5)
当您需要比较或散列结果时,只需使用sorted stringify()。
答案 3 :(得分:3)
// if ya need old browser support
Object.keys = Object.keys || function(o) {
var result = [];
for(var name in o) {
if (o.hasOwnProperty(name))
result.push(name);
}
return result;
};
var o = {c: 3, a: 1, b: 2};
var n = sortem(o);
function sortem(old){
var newo = {}; Object.keys(old).sort().forEach(function(k) {new[k]=old[k]});
return newo;
}
// deep
function sortem(old){
var newo = {}; Object.keys(old).sort().forEach(function(k){ newo[k]=sortem(old[k]) });
return newo;
}
sortem({b:{b:1,a:2},a:{b:1,a:2}})
答案 4 :(得分:0)
这应该谨慎使用,因为您的代码不应该依赖于对象属性顺序。如果它只是一个演示问题(或仅仅是为了好玩!),你可以像这样深刻地对属性进行排序:
function sortObject(src) {
var out;
if (typeof src === 'object' && Object.keys(src).length > 0) {
out = {};
Object.keys(src).sort().forEach(function (key) {
out[key] = sortObject(src[key]);
});
return out;
}
return src;
}
答案 5 :(得分:0)
这里是您的一线客。
let $g = {
method: 'artist.getInfo',
artist: 'Green Day',
format: 'json',
api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
};
let $w = {};
Object.keys($g).sort().map(i=>$w[i]=$g[i]);
console.log($w);
祝你好运!
答案 6 :(得分:0)
ES5 兼容:
function sortByKey(obj) {
var keys = Object.keys(obj);
keys.sort();
var sorted = {};
for (var i = 0; i < keys.length; i++) {
var key = keys[i];
sorted[key] = obj[key];
}
return sorted;
}