如何排序JS对象文字?

时间:2011-06-07 15:08:03

标签: javascript sorting object-literal

如果我有这个JS对象文字:

var foo = {
    Sussy: 4,
    Billy: 5,
    Jimmy: 2,
    Sally: 1
};

如何创建新的已排序对象文字:

var bar = {
    Sally: 1,
    Jimmy: 2,
    Sussy: 4,
    Billy: 5
};

3 个答案:

答案 0 :(得分:11)

Re:如何对JS对象进行排序?

答案:你不能。因此,您需要更复杂的数据结构。你有很多选择:

  1. 您可以使用单独的数组来保存对象键的顺序。 (这就是@Felix Kling的答案所示。)好:通过订单或名称快速检索。错误:需要第二个数据结构,必须与第一个数据结构保持同步。
  2. 这些属性可以保存包含值和排序顺序的对象,而不是简单地保存属性和值的对象。好:1个数据结构。按属性名称快速查找。错误:按顺序查找速度慢(需要扫描结构)。缓慢排序。
  3. 使用数组,其中的元素包含保存键和值的对象。好:1个数据结构。按订单快速查找。快速排序。错误:按属性名称查找速度慢(需要扫描结构)。
  4. 我推荐解决方案3,因为它使用JS机制来管理排序。

    示例:

    // Object holds sort order:  (Solution 2)
    var foo = {
      Suzy: {v: 4, order: 0},
      Billy: {v: 5, order: 1},
      Jimmy: {v: 2, order: 2},
      Sally: {v: 1, order: 3}
    };    
    
    // Array holds keys: (Solution 3)
    var woof = [
      {k: 'Suzy', v: 4},
      {k: 'Billy', v: 5},
      {k: 'Jimmy', v: 2},
      {k: 'Sally', v: 1}
    ];
    
    // Sort the woof array by the key names:
    woof.sort(function(a, b) {
      return a.k.localeCompare(b.k);
    });
    
    // The third key and value:
    woof[2].k; // the third key
    woof[2].v; // the third value
    

    编辑:更新代码以修复拼写错误。谢谢@Martin Fido

答案 1 :(得分:7)

对象属性没有特定的顺序(顺序依赖于实现),您无法对属性进行排序。

您必须保留一系列密钥并对其进行相应排序,例如:

var keys = [];

for(var key in obj) {
    if(obj.hasOwnProperty(key)) {
        keys.push(key);
    }
}

keys.sort(function(a, b) {
    return obj[a] - obj[b];
});

现在,您可以迭代数组的值并使用它们来访问对象的相应属性。

答案 2 :(得分:1)

从ES2015开始,结果对象属性顺序是可预测的。太神奇了。

Check it out here.