【JavaScript】ネストされた配列から最大値を取得する方法
JavaScriptでネストされた配列から最大値を取得する方法
JavaScriptでは、数値が任意の階層で入れ子になった(ネストされた)配列から、全体の中で最も大きな値を取り出したいことがあります。単純なMath.max(...arr)では内側の配列まで展開できないため、再帰処理や配列のフラット化が必要になります。本記事では、その具体的な実装方法を2つのアプローチで解説します。
問題の例
まず、配列の中にさらに配列が含まれる次のようなデータを考えてみましょう。
const arr = [
34, 65, 67,
[
43, 76, 87, 23, 56, 7,
[
54, 7, 87, 23, 79, 994, 2
],
54
], 54, 4, 2
];
この配列から最大値を求めた場合、期待される出力は次のとおりです。
994
方法1:再帰関数を使って最大値を求める
配列の各要素を順番に走査し、要素が配列であれば自分自身を再帰的に呼び出して内側の値もチェックします。要素が数値であれば、それまでの最大値と比較して大きい場合に更新していきます。
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)); // 994
このコードのポイントは次の2点です。
- 初期値として
-Infinityを使用: 負の無限大を初期値にすることで、配列にどんな小さな数値が入っていても正しく比較できます。 Array.isArray()による判定: 要素が配列かどうかを判別し、配列であれば再帰呼び出しを行い、その戻り値で最大値を更新します。再帰呼び出しの結果を必ず変数に代入することが重要です。
方法2:flat()で平坦化してから比較する
ES2019以降を使用できる環境であれば、Array.prototype.flat()にInfinityを渡すことで、どれだけ深くネストしていても配列を一次元に平坦化できます。これを組み合わせると、より簡潔に記述できます。
const getMax = arr => Math.max(...arr.flat(Infinity));
console.log(getMax(arr)); // 994
こちらの方法はコード量が少なく読みやすいのが特徴ですが、非常に深いネストや巨大な配列を扱う場合は、再帰版の方がメモリ効率に優れるケースもあります。
まとめ
ネストされた配列から最大値を取得するには、①再帰関数で各階層を辿る方法と、②flat(Infinity)で平坦化してからMath.max()を使う方法の2つが有効です。どちらのアプローチでも、ネストの深さが事前にわからないデータに対しても確実に最大値を求めることができます。
-
JavaScriptで配列内の3番目に大きい数値を取得する方法
JavaScriptでは、数値の配列を第1引数(唯一の引数)として受け取る関数を作成することが求められます。この関数の役割は、配列の中から3番目に大きい数値を選び出して返すことです。もし配列内に3番目に大きい数値が存在しない場合(ユニークな数値が3つ未満の場合)は、代わりに配列の最大値を返します。具体例たとえば、入力配列が以下のようになっているとします。const arr = [34, 67, 31, 87, 12, 30, 22];この場合、数値を降順に並べると「87 → 67 → 34」となるため、期待される出力は次のとおりです。const output = 34;実装コードこの処理を実現
-
【JavaScript入門】配列内で最初の非連続な数値を見つける方法
はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実