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

mat*_*990 55 javascript sorting object

我一直在寻找一段时间,想要一种方法来对这样的Javascript对象进行排序:

{
    method: 'artist.getInfo',
    artist: 'Green Day',
    format: 'json',
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
}
Run Code Online (Sandbox Code Playgroud)

并按名称按字母顺序排序得到:

{
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716',
    artist: 'Green Day',
    format: 'json',
    method: 'artist.getInfo'
}
Run Code Online (Sandbox Code Playgroud)

我找不到任何可以执行此操作的代码.谁能给我一些帮助?

Chr*_*sen 85

根据定义,对象中键顺序是未定义的,因此您可能无法以面向未来的方式执行此操作.相反,您应该考虑在实际向用户显示对象时对这些键进行排序.无论如何,它在内部使用的排序顺序并不重要.

按照惯例,大多数浏览器将按照添加顺序保留对象中键的顺序.所以,你可以做到这一点,但不要指望它始终有效:

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 几乎与[stacksort](http://gkoberger.github.com/stacksort/)一起使用. (28认同)
  • 那个 StackSort 答案从来没有完成它的工作...... (7认同)
  • ***这个答案已经过时了。在 ES6 对象中,键现在是有序的。*** 请参阅 [这个问题](/sf/ask/382699061/) 以获得最新答案! (4认同)
  • 你应该最明确地使用一个数组. (2认同)

Bre*_*ton 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;
}
Run Code Online (Sandbox Code Playgroud)

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


exe*_*ook 5

只需在需要比较或散列结果时使用有序的stringify().


ste*_*gwa 5

这是给你的一句话。

Array.prototype.reduce()

let data = {
    method: 'artist.getInfo',
    artist: 'Green Day',
    format: 'json',
    api_key: 'fa3af76b9396d0091c9c41ebe3c63716'
};

let sorted = Object.keys(data).sort().reduce( (acc, currValue) => {
    acc[currValue] = data[currValue];
    return acc;
}, {});

console.log(sorted);

Run Code Online (Sandbox Code Playgroud)

祝你好运!!

  • 甚至更小: ```Object.keys(data).sort().reduce((o, key) =&gt; ({...o, [key]: data[key]}), {})``` (2认同)