1. ホーム
  2. javascript

[解決済み] Javascriptで連想配列の値で並べ替えるには?

2023-05-31 16:48:12

質問

連想配列があります。

array["sub2"] = 1;
array["sub0"] = -1;
array["sub1"] = 0;
array["sub3"] = 1;
array["sub4"] = 0;

その結果、この順序でそれぞれのインデックスを持つ配列になるような、値で(降順に)ソートする最もエレガントな方法は何でしょうか。

sub2, sub3, sub1, sub4, sub0

どのように解決するのですか?

Javascript には、あなたが考えているような "連想配列はありません。 代わりに、配列のような構文を使用してオブジェクトのプロパティを設定する機能 (例) と、オブジェクトのプロパティを反復処理する機能があるだけです。

この結果、オブジェクトのプロパティを設定する際に 順序 であるため、プロパティのソートのようなものは存在しません。 その代わりに、オブジェクトのプロパティを(順序が保証される)配列に変換する必要があります。 以下は、オブジェクトを 2 タプル (2 要素の配列) の配列に変換し、説明したようにソートして、それを反復処理するコードスニペットです。

var tuples = [];

for (var key in obj) tuples.push([key, obj[key]]);

tuples.sort(function(a, b) {
    a = a[1];
    b = b[1];

    return a < b ? -1 : (a > b ? 1 : 0);
});

for (var i = 0; i < tuples.length; i++) {
    var key = tuples[i][0];
    var value = tuples[i][1];

    // do something with key and value
}

コールバックを受け取る関数でこれを包むのがより自然であると分かるかもしれません。

function bySortedValue(obj, callback, context) {
  var tuples = [];

  for (var key in obj) tuples.push([key, obj[key]]);

  tuples.sort(function(a, b) {
    return a[1] < b[1] ? 1 : a[1] > b[1] ? -1 : 0
  });

  var length = tuples.length;
  while (length--) callback.call(context, tuples[length][0], tuples[length][1]);
}

bySortedValue({
  foo: 1,
  bar: 7,
  baz: 3
}, function(key, value) {
  document.getElementById('res').innerHTML += `${key}: ${value}<br>`
});
<p id='res'>Result:<br/><br/><p>