11

この JS オブジェクト リテラルがある場合:

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

新しいソートされたオブジェクト リテラルを作成するにはどうすればよいですか。

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

3 に答える 3

12

Re: JS オブジェクトをソートする方法は?

答え: できません。代わりに、より洗練されたデータ構造が必要です。多くのオプションがあります:

  1. 別の配列を使用して、オブジェクトのキーの順序を保持できます。(これは@Felix Klingの回答が示すものです。)良い:順序または名前による高速検索。悪い例: 最初のデータ構造との同期を維持する必要がある 2 番目のデータ構造が必要です。
  2. オブジェクトが単にプロパティと値を保持する代わりに、プロパティは値とソート順を保持するオブジェクトを保持できます。良い: 1 つのデータ構造。プロパティ名による高速検索。悪い: 順序による検索が遅い (構造をスキャンする必要がある)。ソートが遅い。
  3. キーと値を保持するオブジェクトで構成される要素を持つ配列を使用します。良い: 1 つのデータ構造。注文による高速検索。高速ソート。悪い: プロパティ名による検索が遅い (構造をスキャンする必要がある)。

JS メカニズムを使用して順序を管理するため、解決策 3 をお勧めします。

例:

// 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

編集: タイプミスを修正するためにコードを更新しました。ありがとう、@Martin Fido

于 2011-06-07T15:49:06.057 に答える
8

オブジェクト プロパティは特定の順序ではなく (順序は実装に依存します)、プロパティを並べ替えることができません。

キーの配列を保持し、それに応じて並べ替える必要があります。次に例を示します。

var keys = [];

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

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

これで、配列の値を繰り返し処理し、それらを使用してオブジェクトの対応するプロパティにアクセスできます。

于 2011-06-07T15:17:23.037 に答える