2011-06-07 56 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]; 
}); 

現在你可以遍歷數組的值,並用它們來訪問對象的相應屬性。