按属性名称对 JavaScript 对象进行排序

IT技术 javascript sorting object
2021-02-08 18:53:45

我一直在寻找一段时间,想要一种对 Javascript 对象进行排序的方法,如下所示:

{
    method: 'artist.getInfo',
    artist: 'Green Day',
    format: 'json',
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
}

并按名称的字母顺序排序以获得:

{
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716',
    artist: 'Green Day',
    format: 'json',
    method: 'artist.getInfo'
}

我找不到任何可以执行此操作的代码。任何人都可以给我一些帮助吗?

6个回答

从评论更新:

这个答案已经过时了。在 ES6 对象中,键现在是有序的。请参阅此问题以获取最新答案

根据定义,对象中键顺序是 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;
}
那个 StackSort 的答案从来没有完成它的工作......
2021-03-20 18:53:45
这似乎完美地工作。我将不得不密切关注它在未来的浏览器中的崩溃,但它现在似乎有效。谢谢您的帮助 :)
2021-03-24 18:53:45
它实际上可能总是有效,并且它正在被编入 Ecmascript 标准中,但它仍然不是一个可靠的假设,因为具有定义的顺序在逻辑上不是“对象”的一部分。如果要定义顺序,则应使用数组。
2021-03-28 18:53:45
这个答案已经过时了。在 ES6 对象中,键现在是有序的。请参阅此问题以获取最新答案!
2021-04-02 18:53:45
您绝对应该为此使用数组。
2021-04-09 18:53:45

此函数接受一个对象并返回 [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;
}

对象数据结构没有明确定义的顺序。在数学术语中,对象中的键集合是一个无序集,应该这样对待。如果要定义顺序,则应该使用数组,因为具有顺序的数组是您可以依赖的假设。具有某种顺序的对象是留给实现的突发奇想的东西。

当您需要比较或散列结果时,只需使用sorted stringify()

// 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}})
非常漂亮和光滑,但不幸的是 Object.keys() 在 IE<9 中不受支持,也不在任何 IE>=9 的 Quirks 模式中。请参阅MSDN 的 IE 开发中心
2021-03-21 18:53:45
如果您的意思是对 obj 进行深度排序,我编辑了上面的答案。“新”是一个错字。
2021-04-02 18:53:45
在上面的答案中添加了多边形填充
2021-04-04 18:53:45

这是给你的单线。

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);

祝你好运!!