如何排序JS对象文字?

edt*_*edt 10 javascript sorting object-literal

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

var foo = {
    Sussy: 4,
    Billy: 5,
    Jimmy: 2,
    Sally: 1
};
Run Code Online (Sandbox Code Playgroud)

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

var bar = {
    Sally: 1,
    Jimmy: 2,
    Sussy: 4,
    Billy: 5
};
Run Code Online (Sandbox Code Playgroud)

Lar*_*y K 12

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

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

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

我推荐解决方案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
Run Code Online (Sandbox Code Playgroud)

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


Fel*_*ing 8

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

您必须保留一组键并相应地对其进行排序,例如:

var keys = [];

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

keys.sort(function(a, b) {
    return obj[a] - obj[b];
});
Run Code Online (Sandbox Code Playgroud)

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