【问题标题】:Sorting a JavaScript object by property name按属性名称对 JavaScript 对象进行排序
【发布时间】:2010-11-24 11:46:29
【问题描述】:

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

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

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

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

我找不到任何可以执行此操作的代码。谁能帮帮我?

【问题讨论】:

标签: javascript sorting object


【解决方案1】:

来自 cmets 的更新:

这个答案已经过时了。在 ES6 对象中,键现在是有序的。看到this questionup-to-date answer

根据定义,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;
}

【讨论】:

  • 这似乎工作得很好。我将不得不密切关注它在未来的浏览器中的破坏,但它现在似乎可以工作。感谢您的帮助:)
  • 它实际上可能总是有效的,并且它正在被编入 Ecmascript 标准,但它仍然不是一个可以依赖的安全假设,因为定义的顺序在逻辑上不是“对象”的一部分.如果你想定义顺序,你应该使用一个数组。
  • 您绝对应该为此使用数组。
  • 这个答案已经过时了。在 ES6 对象中,键现在是有序的。请参阅 this question 以获得最新答案!
  • 一个 StackSort 的答案永远不会完成它的工作......
【解决方案2】:

此函数接受一个对象并返回一个排序数组,其形式为 [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;
}

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:
      // 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}})
      

      【讨论】:

      • 相当漂亮和流畅,但不幸的是,IE=9 的 Quirks 模式。见MSDN's IE Dev Center
      • 在上面的答案中添加了多边形填充
      • 如果您的意思是对 obj 进行深度排序,我在上面编辑了答案。 “新”是一个错字。
      【解决方案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);
      
      

      祝你好运!

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

          这应该谨慎使用,因为您的代码不应该依赖于对象属性的顺序。如果只是为了展示(或者只是为了好玩!),您可以像这样对属性进行深度排序:

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

          【讨论】:

            猜你喜欢
            • 2011-09-06
            • 1970-01-01
            • 1970-01-01
            • 2015-10-27
            • 2019-07-27
            • 1970-01-01
            相关资源
            最近更新 更多