web-dev-qa-db-ja.com

JavaScriptオブジェクトをプロパティ名でソートする

私はしばらく探していましたが、このようなJavascriptオブジェクトをソートする方法が必要です:

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

そして、ソートは名前のアルファベット順になります:

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

これを行うコードは見つかりません。誰か助けてもらえますか?

54
matto1990

定義では、オブジェクト内のキーの 順序は未定義 であるため、おそらくこれを行うことはできません将来性のある方法。代わりに、オブジェクトが実際にユーザーに表示されているときにこれらのキーを並べ替えることを検討する必要があります。内部で使用する並べ替え順序は、とにかく重要ではありません。

慣例により、ほとんどのブラウザーは、追加された順序でオブジェクト内のキーの順序を保持します。だから、あなたはこれを行うことができますが、常に機能すると期待しないでください:

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;
}
84
Chris Nielsen

この関数はオブジェクトを取り、[key、value]の形式の配列のソートされた配列を返します

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

オブジェクトのデータ構造には、明確に定義された順序がありません。数学的には、オブジェクト内のキーのコレクションは順序付けられていないセットであり、そのように扱う必要があります。順序を定義する場合、配列を使用する必要があります。順序を持つ配列は信頼できる前提であるためです。何らかの順序を持​​つオブジェクトは、実装の気まぐれに任せられます。

12
Breton

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

5
exebook
// 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}})
3
John Williams

コードはオブジェクトプロパティの順序に依存してはならないため、これは注意して使用する必要があります。表示の問題(または単に楽しみの問題)の場合、プロパティを次のように深く並べ替えることができます。

function sortObject(src) {
  var out;
  if (typeof src === 'object' && Object.keys(src).length > 0) {
    out = {};
    Object.keys(src).sort().forEach(function (key) {
      out[key] = sortObject(src[key]);
    });
    return out;
  }
  return src;
}
0
Pierre Maoui