2009-08-31 167 views
49

我一直在找了一會兒,想辦法進行排序JavaScript對象是這樣的:按屬性名稱排序JavaScript對象

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

和排序是按名稱字母來獲得:

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

我找不到任何代碼可以做到這一點。任何人都可以給我一些幫助嗎?

+0

http://www.javascriptkit.com/javatutors/arraysort.shtml - 有關排序複雜JS對象的體面教程。 http://www.highdots.com/forums/javascript/re-sorting-json-data-270187.html - 另一個例子--- 如果您需要詳細信息,請參閱sort函數的完整參考https:/ /developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort -Last edit,我發誓! – 2009-08-31 23:02:04

+0

我得到的問題是這些文章展示瞭如何對對象數組進行排序。我正在嘗試對填充了對象的對象進行排序。請問同樣的例子適用於我的案例,如果可以的話,你能提供一個例子嗎? 對不起,我只是真的卡在這一個:s – matto1990 2009-08-31 23:09:59

+5

這是一個古老的問題,但我是一個學生,所以第十億次:沒有這樣的東西作爲JSON對象 - 至少,不在你指的是它的方式。有javascript對象和JSON字符串。 – 2012-12-12 18:29:02

回答

73

根據定義,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; 
} 
+0

這似乎很好地工作。我將不得不在未來的瀏覽器中關注它,但它現在似乎仍然有效。 感謝您的幫助:) – matto1990 2009-08-31 23:14:49

+0

它實際上可能始終有效,它正在被編入Ecmascript標準中,但它依然不是一個安全的假設,因爲具有已定義的順序在邏輯上不是「對象」的一部分」。如果你想定義順序,你應該使用一個數組。 – Breton 2009-08-31 23:33:43

+0

我需要這樣做的唯一原因是對值進行一次排序,以便我可以生成第6部分中此頁面上定義的api簽名:http://www.last.fm/api/webauth 如果我正在使用它比我更多地使用數組,然後他們排序。 – matto1990 2009-08-31 23:37:42

12

此功能需要一個對象,並返回形式排列的有序數組[鍵,值]

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
// 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}}) 
+0

非常好,很流暢,但不幸的是,Object.keys()在IE <9中不受支持,並且在任何IE> = 9的Quirks模式下都不支持。請參閱[MSDN的IE開發人員中心](http://msdn.microsoft.com/en-us/library/ie/ff688127(v = vs.94).aspx)。 – Jpsy 2013-10-28 11:29:10

+0

在上面的答案中添加了poly填充 – 2014-03-09 15:27:54

+0

如果您的意思是深度排列的obj,我編輯了上面的答案。 '新'是一個錯字。 – 2014-03-09 15:54:15