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

JavaScriptでネストされた配列から最大値を見つける方法

JavaScriptでは、数値が入れ子になった配列(ネストされた配列)から最大値を取り出したい場面があります。この記事では、任意の深さまでネストされた数値配列を受け取り、その中に含まれる最大の数値を返すシンプルな関数を実装していきます。

問題の例

まず、次のような配列を入力として渡すケースを考えてみましょう。

const arr = [
  34, 65, 67,
  [
    43, 76, 87, 23, 56, 7,
    [
      54, 7, 87, 23, 79, 314, 2
    ],
    54
  ], 54, 4, 2
];

この場合、期待される出力は次のとおりです。

314

アプローチ:再帰を使う

配列の要素には数値だけでなく、さらに配列が含まれている可能性があるため、単純なループだけでは対応できません。そこで再帰(recursion)を活用します。

基本的な考え方は以下のとおりです。

  • 配列内の各要素を順番にチェックする。
  • 要素が配列であれば、同じ関数を再帰的に呼び出してその内部も探索する。
  • 要素が数値であれば、現在の最大値と比較し、大きければ更新する。
  • 最後に最大値を返す。

サンプルコード

const arr = [
  34, 65, 67,
  [
    43, 76, 87, 23, 56, 7,
    [
      54, 7, 87, 23, 79, 314, 2
    ],
    54
  ], 54, 4, 2
];

const findGreatest = (arr, greatest = -Infinity) => {
  let max = greatest;
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      // 要素が配列の場合は再帰的に探索し、結果を反映する
      max = findGreatest(arr[i], max);
    } else if (arr[i] > max) {
      max = arr[i];
    }
  }
  return max;
};

console.log(findGreatest(arr));

コードのポイント

  • デフォルト引数 -Infinity を使うことで、どんな数値とも比較できる初期値を設定しています。
  • Array.isArray() で要素が配列かどうかを判定し、配列であれば再帰呼び出しを行います。
  • 再帰呼び出しの戻り値を現在の最大値に代入することで、ネストより後ろの要素も正しく比較されます。ここで return してしまうと、残りの要素が未チェックのまま処理が終了してしまうため注意が必要です。

出力結果

コンソールには次のように表示されます。

314

別のアプローチ:flat() と Math.max() を組み合わせる

ES2019 以降の環境であれば、Array.prototype.flat()Math.max() を組み合わせることで、より簡潔に記述できます。

const findMax = (arr) => Math.max(...arr.flat(Infinity));

console.log(findMax(arr)); // 314

flat(Infinity) は、すべての階層の配列を1つの平坦な配列へ展開するため、どれほど深いネストでも対応できます。手軽で読みやすい一方、非常に大きな配列ではスプレッド演算子の引数上限やメモリ消費に注意が必要です。

まとめ

ネストされた配列の最大値を求める基本は、再帰処理で配列構造をたどりながら数値を比較することです。モダンなJavaScript環境では flat(Infinity)Math.max() を使った簡潔な書き方も選択肢になります。データの規模や対応ブラウザに応じて、最適な方法を選びましょう。

  1. JavaScriptで配列内の紛らわしい数(Confusing Number)を見つける方法

    紛らわしい数(Confusing Numbers)とは? 配列内のある数値が「紛らわしい数」とみなされるのは、その数値を上下左右に180度回転した結果が、同じ配列内に存在する別の数値になる場合です。たとえば、6を180度回転すると9になり、逆に9を回転すると6になります。 ただし注意が必要なのは、180度回転しても有効な数字として成立するのは 0、1、6、8、9 の5種類だけという点です。2、3、4、5、7 を含む数値は、回転しても正しい数として扱うことができません。 今回求められているのは、自然数 num を第1引数(唯一の引数)として受け取るJavaScript関数を作成することです。この

  2. 【JavaScript入門】配列内で最初の非連続な数値を見つける方法

    はじめに本記事では、JavaScriptを使って「数値の配列の中から、直前の要素と連続していない最初の数値」を見つける方法を解説します。アルゴリズムの練習やコーディング面接の対策としても役立つ基本的な問題です。 問題の定義数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、直前の要素に対して +1 となっていない(連続していない)最初の要素を返さなければなりません。 言い換えると、隣り合う要素同士の差が1以外になる箇所が現れたとき、その箇所の後ろ側の要素を返すという処理です。なお、そのような要素が必ず配列内に1つ以上存在するものとします。 サンプルコード以下は、実