JavaScriptの多次元配列から最大値を取得する方法
JavaScriptでは、任意の深さにネストされた数値の配列の中から最大の数値を見つけ出す関数を作成できます。この記事では、再帰処理を使って多次元配列内の最大値を求める方法を、具体的なコード例とともに解説します。
問題の例
例えば、次のような入れ子構造の配列が入力として与えられた場合を考えてみましょう。
const arr = [
34, 65, 67,
[
43, 76, 87, 23, 56, 7,
[
54, 7, 87, 23, 79, 994, 2
],
54
], 54, 4, 2
];
この場合、期待される出力は次のとおりです。
994
アプローチ:再帰を使った解法
配列の要素には数値だけでなく、さらにネストした配列が含まれる可能性があります。そこで Array.isArray() を使って要素が配列かどうかを判定し、配列であれば自分自身(同じ関数)を再帰的に呼び出して、その内部も探索します。各階層でこれまで見つかった最大値を引数として引き継ぐことで、全体の最大値を求められます。
コード例
const getGreatest = (arr, greatest = -Infinity) => {
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
// 要素が配列の場合は再帰的に探索する
greatest = getGreatest(arr[i], greatest);
} else if (arr[i] > greatest) {
greatest = arr[i];
}
}
return greatest;
};
console.log(getGreatest(arr));
実装上の重要なポイントは、ネストした配列を見つけたときに return で即座に結果を返すのではなく、再帰呼び出しの戻り値を greatest に代入して、残りの要素も引き続きチェックすることです。return で即座に返してしまうと、最初のネスト配列以降の要素が一切評価されず、別の場所により大きな値がある場合に誤った結果になる恐れがあります。
出力結果
コンソールには次のように表示されます。
994
別解:flat() と Math.max() を使う方法
ES2019以降の環境であれば、Array.prototype.flat() に Infinity を渡すことで、任意の深さのネストをすべて展開して一次元化できます。これを利用すると、より簡潔に書くことが可能です。
const getMax = (arr) => Math.max(...arr.flat(Infinity));
console.log(getMax(arr)); // 994
ただし、この方法は要素数が非常に多い配列に対してスプレッド演算子で引数を展開するため、Math.max() の引数上限を超えるとエラーになるリスクがあります。大規模なデータを扱う場合は、reduce() を組み合わせた次のような実装が安全です。
const getMaxSafe = (arr) =>
arr.flat(Infinity).reduce((max, n) => (n > max ? n : max), -Infinity);
console.log(getMaxSafe(arr)); // 994
まとめ
多次元配列の最大値を求める場合、再帰的に配列を走査する方法が基本となります。一方、モダンなJavaScriptでは flat(Infinity) を活用すれば、短いコードで同じ結果を実現できます。データの規模や実行環境に応じて、最適な方法を選択しましょう。
-
JavaScriptで配列の最初の要素と最後の要素を取得する方法
配列とは、複数の要素をひとまとめにして管理するデータ構造です。各要素にはそれぞれ固有のインデックス番号が割り当てられており、このインデックスを使うことで任意の要素へアクセスできます。ただし、最後の要素に関しては、配列に含まれる要素数が分からなければインデックスも確定しないため、少し工夫が必要です。本記事では、これらの方法をわかりやすく解説します。 最初の要素へのアクセス JavaScriptでは配列のインデックスは「0」から始まるため、最初の要素の位置は常に分かっています。そのため、値の取得は非常に簡単です。配列を arr とすると、最初の要素の値は arr[0] で表されます。 サンプ
-
JavaScriptで配列の最後の要素を取得・表示する方法
配列の最後の要素を取得して画面に表示するには、pop()メソッドを利用するのが手軽です。以下に、ボタンをクリックすると配列の最後の要素を表示するサンプルコードを示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> &