2009-08-31 9 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 - 別の例--- ここには、https:/ /developer.mozilla.org/ja/Core_JavaScript_1.5_Reference/Global_Objects/Array/sort - 最新の編集、私は誓います! –

+0

問題は、これらの記事でオブジェクトの配列を並べ替える方法を示していることです。私はオブジェクトでいっぱいのオブジェクトをソートしようとしています。同じ事例が私の場合にも役立つでしょうか、もしあなたが例を挙げることができたら?少なくとも、ないで - JSONオブジェクトのようなものはありません。■ – matto1990

+5

これは古代の質問ですが、10億時間をので、私は、PEDANTだ:私は本当に、このいずれかにこだわって申し訳ありません あなたがそれを参照している方法。 JavaScriptオブジェクトとJSON文字列があります。 –

答えて

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

+0

定義された順序を持つことが、論理的に「オブジェクトの一部ではないので、それは実際には常に動作することができ、それはECMAScriptの標準に成文化されているが、まだに頼る安全な仮定ではありません"順序を定義する場合は、配列を使用する必要があります。 http://www.last.fm/api/webauth 私が使っていた場合: – Breton

+0

私はそれを行う必要がある唯一の理由は、セクション6で、このページで定義されているので、私はAPI署名を生成することができ、一度値をソートすることですそれ以上のものは配列を使い、それを並べ替えます。 – matto1990

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; 
} 

オブジェクトデータ構造には明確な順序はありません。数学的には、オブジェクト内のキーの集合は順序付けられていない集合であり、そのように扱われるべきである。 注文を定義する場合は、配列を使用してください(SHOULD)。順序を持つ配列は、あなたが信頼できるという前提です。何らかの順序を持​​つオブジェクトは、実装の気まぐれに残されているものです。

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 Dev Center](http://msdn.microsoft.com/en-us/library/ie/ff688127(v = vs94).aspx)を参照してください。 – Jpsy

+0

上記のポリfillを追加しました –

+0

objの深い並べ替えを意味するならば、私は上記の答えを編集しました。 「新」はタイプミスでした。 –

4

結果を比較またはハッシュする必要がある場合は、sorted stringify()を使用してください。