JavaScriptで配列の最大値が存在するすべてのインデックスを取得する方法
JavaScriptでは、数値の配列から最大値が格納されているインデックス(位置)を取得したい場面があります。さらに、配列内には最大値が複数回出現するケースも考えられます。
そこで本記事では、数値の配列を受け取り、その中の最大値が存在するすべてのインデックスを配列として返す関数の実装方法を解説します。
実装の流れ
実装は以下の2ステップで行います。
Math.max()とスプレッド構文(...)を組み合わせて、配列内の最大値を求めるreduce()メソッドで配列を走査し、最大値と一致する要素のインデックスだけを収集する
コード例
実際のコードは次のとおりです。
const arr = [10, 5, 4, 10, 5, 10, 6];
const findGreatestIndices = arr => {
const val = Math.max(...arr);
const greatest = arr.reduce((indexes, element, index) => {
if(element === val){
return indexes.concat([index]);
} else {
return indexes;
};
}, []);
return greatest;
}
console.log(findGreatestIndices(arr));実行結果
コンソールには次のように出力されます。
[ 0, 3, 5 ]
コードの解説
まず、Math.max(...arr)によって配列内の最大値「10」を取得しています。スプレッド構文を使うことで、配列の各要素をMath.max()の引数として展開できます。
次に、reduce()メソッドで配列の先頭から順に各要素をチェックし、最大値と一致する要素のインデックスだけを新しい配列に追加していきます。一致しない場合は、そのまま現在のインデックス配列を返します。
この例では、最大値「10」はインデックス「0」「3」「5」の3箇所に存在するため、結果として[ 0, 3, 5 ]が返されます。
まとめ
Math.max()とreduce()を組み合わせることで、配列内の最大値が重複して存在する場合でも、そのすべての位置を簡単に取得できます。最大値が1つだけの場合にも対応できる汎用的な実装なので、ランキング処理やデータ分析など、さまざまな場面で活用できます。
-
【JavaScript】配列内のネストされたオブジェクトの値を合計する方法
この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d
-
複数の値でJavaScript配列の要素を検索する方法
JavaScriptである配列(arr)が、別の配列(arr1)の複数の値・すべての要素を含んでいるかどうかを確認したい場面はよくあります。そんなときは、every()メソッドとincludes()メソッドを組み合わせることで、シンプルに判定できます。以下はそのサンプルコードです。 コード例 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content=