2011-06-07 38 views
8

如果我有这个JS对象常量:如何排序JS对象文字?

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

如何创建一个新的,分类对象文本:

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

如你的问题你不能排序JS对象。不可能。为什么?因为JS对象属性没有排序。切换到数组。数组是有序的,对象不是。 – 2011-06-07 15:21:24

回答

9

回复:如何排序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 

修改于:更新代码来解决错字。谢谢@马丁菲

+0

+1我也喜欢第三个选项:) – 2011-06-07 15:55:56

+0

感谢您让我走上正确的轨道和所有细节。我会尝试#3。 – edt 2011-06-08 15:18:40

+1

@拉里克 - 帮我堵塞了。谢谢。 – dopatraman 2012-04-15 23:57:59

6

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

你必须保持键的排列,因此对它进行排序,例如:

var keys = []; 

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

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

现在你可以遍历数组的值,并用它们来访问对象的相应属性。