JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptでオブジェクト配列からキーごとの最大値を持つ要素を取得する方法

問題の概要

次のようなオブジェクトの配列があるとします。

const arr = [
   {a:1, b:"apples"},
   {a:3, b:"apples"},
   {a:4, b:"apples"},
   {a:1, b:"bananas"},
   {a:3, b:"bananas"},
   {a:5, b:"bananas"},
   {a:6, b:"bananas"},
   {a:3, b:"oranges"},
   {a:5, b:"oranges"},
   {a:6, b:"oranges"},
   {a:10, b:"oranges"}
];

この配列を受け取り、新しいオブジェクトの配列を返すJavaScript関数を作成する必要があります。

返される配列には、プロパティ「b」の一意な値ごとに1つのオブジェクトが含まれ、その中でプロパティ「a」の値が最大であるものを選び出します。

上記の例で言えば、「apples」グループからは最大値4、「bananas」グループからは最大値6、「oranges」グループからは最大値10を持つオブジェクトがそれぞれ抽出されることになります。

実装コード

以下がそのコードです。

const arr = [
   {a:1, b:"apples"},
   {a:3, b:"apples"},
   {a:4, b:"apples"},
   {a:1, b:"bananas"},
   {a:3, b:"bananas"},
   {a:5, b:"bananas"},
   {a:6, b:"bananas"},
   {a:3, b:"oranges"},
   {a:5, b:"oranges"},
   {a:6, b:"oranges"},
   {a:10, b:"oranges"}
];

const pickHighest = arr => {
   const res = [], map = {};

   arr.forEach(el => {
      if (!(el['b'] in map)) {
         map[el['b']] = res.push(el) - 1;
         return;
    };
      if(res[map[el['b']]]['a'] < el['a']){
         res[map[el['b']]] = el;
    };
   });
   return res;
};
console.log(pickHighest(arr));

コードの解説

この関数の仕組みを簡単に整理すると、次の通りです。

  • 結果を格納する配列 res と、各キー(bの値)が res のどのインデックスに対応するかを記録するマップオブジェクト map を用意します。
  • forEach で各要素を走査し、まだ見たことのない「b」の値であれば、その要素を res に追加し、push の戻り値(追加後の長さ)からインデックスを算出して map に記録します。
  • すでに存在する「b」の値であれば、保存済みオブジェクトの「a」と現在の要素の「a」を比較し、現在の方が大きければ上書きします。
  • 最終的に、各キーごとに最大の「a」を持つオブジェクトだけが残った配列を返します。

実行結果

コンソールへの出力は以下のようになります。

[
   { a: 4, b: 'apples' },
   { a: 6, b: 'bananas' },
   { a: 10, b: 'oranges' }
]

期待通り、「apples」「bananas」「oranges」それぞれのグループ内で最大の「a」の値を持つオブジェクトだけが抽出されました。

このアプローチは配列を一度だけ走査すればよいため、計算量は O(n) となり、データ件数が多い場合でも効率的に動作します。また、reduceMap オブジェクトを組み合わせることでも同様の処理を実装できるので、用途や可読性の観点から使い分けると良いでしょう。

  1. JavaScriptでhref属性の値を取得する方法|jQueryのattr()メソッド活用ガイド

    Web開発では、アンカータグ(<a>)に設定されたリンク先URL、つまりhref属性の値を取得したい場面がよくあります。この記事では、jQueryのattr()メソッドを使って、簡単にhrefの値を取得する方法を解説します。対象となるHTMLの例たとえば、以下のようなアンカータグがあったとします。<a class=demo title=get the url href=./mainPage.jsp/1245>href value at console</a>ここで必要なのは、テキスト部分ではなく、URLそのもの、すなわちhref属性の値「./mainPage

  2. Pythonの辞書で値が最大のキーを取得する方法

    Pythonの辞書(dict)は、キーと値のペアを格納するデータ構造です。本記事では、与えられた辞書の中から値が最大である要素のキーを取得する方法を、代表的な2つの手法に分けて解説します。 方法1:max()関数とget()メソッドを使う 最も簡潔なのが、組み込みのmax()関数と辞書のget()メソッドを組み合わせる方法です。max()関数はデフォルトで辞書のキーを走査するため、key=dictA.getを指定すると「各キーに対応する値」を比較基準として、値が最大のキーが返されます。 サンプルコード dictA = {"Mon": 3, "Tue"