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
アプローチ:再帰を使う
配列は何重にも入れ子になっているため、単純なループだけではすべての要素を走査できません。そこで再帰(recursion)を活用します。配列の各要素を順番に調べ、要素がさらに配列であれば自分自身を呼び出して内部を探索し、数値であれば現在の最大値と比較して更新していきます。
コード例
実装コードは以下のとおりです。
const arr = [
34, 65, 67,
[
43, 76, 87, 23, 56, 7,
[
54, 7, 87, 23, 79, 994, 2
],
54
], 54, 4, 2
];
const getGreatest = (arr, greatest = -Infinity) => {
for(let i = 0; i < arr.length; i++){
if(Array.isArray(arr[i])){
return getGreatest(arr[i], greatest);
};
if(arr[i] > greatest){
greatest = arr[i];
}
};
return greatest;
};
console.log(getGreatest(arr));実行結果
コンソールには次のように出力されます。
994
コードのポイント
- 初期値に -Infinity を使用:負の無限大を初期値とすることで、どんなに小さい数値とも正しく比較できます。
- Array.isArray() による判定:要素が配列かどうかを判定し、配列であれば同じ関数を再帰的に呼び出します。
- 最大値の更新:数値要素の場合は現在の最大値より大きいかを確認し、大きければ置き換えます。
より堅牢な改良版
上記のコードは、ネストされた配列に遭遇した時点で再帰の結果をすぐに return しています。そのため、複数のネスト配列が存在し、最初の配列に最大値が含まれないようなケースでは意図した結果にならない可能性があります。再帰の戻り値を変数に代入してループを継続するように書き換えると、より安全です。
const getGreatest = (arr, greatest = -Infinity) => {
let max = greatest;
for(const item of arr){
if(Array.isArray(item)){
max = Math.max(max, getGreatest(item, max));
} else {
max = Math.max(max, item);
}
}
return max;
};このように実装すれば、ネストされた配列がどこにあっても、またいくつあっても、常に正しい最大値を取得できます。
-
JavaScriptで数値配列から欠落している要素を効率的に見つける方法
本記事では、長さnの数値配列を受け取り、その中で欠落しているたった1つの整数を見つけるJavaScript関数を作成します。配列には本来0からnまでの整数がすべて含まれているはずですが、そのうち1つだけが欠けています。しかも、どの数字が欠けているのかは事前に分からず、配列もソートされていません。 問題のポイント 配列の長さはnで、0〜nまでの整数が1つだけ欠けた状態で格納されている 配列はソートされていない 線形時間(O(n))かつ定数領域(O(1))で解決する必要がある 解決のアプローチ:合計値の差を利用する 配列には0からnまでの数字が1つだけ欠けて含まれています。ここで「0からnまで
-
JavaScriptで配列から最大の「1度だけ現れる数値」を見つける方法
本記事では、整数の配列を第1引数(かつ唯一の引数)として受け取るJavaScript関数を作成する方法を解説します。この関数の役割は、配列を順番に走査し、その中で一度だけ出現する数値のうち最大のものを見つけ出して返すことです。もし配列内に一意な数値がひとつも存在しない場合は、-1を返す仕様とします。前提となる制約配列の各要素には次の制約が与えられています。つまり、すべての要素は0より大きく101未満であることが保証されています。0 < arr[i] < 101具体例たとえば、入力配列が以下のような場合を考えてみましょう。const arr = [35, 37, 33, 39, 34