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

再帰を使ってJavaScriptでネストされた配列の合計を求める方法

JavaScriptでは、数値が入れ子になった(ネストされた)配列を受け取り、その中に含まれるすべての数値の合計を返す関数が必要になることがあります。配列の中にさらに配列が含まれている場合、単純なループだけでは対応できません。そこで役立つのが「再帰」です。再帰とは、関数が自分自身を呼び出す仕組みのことで、深さが不定のネスト構造でも柔軟に処理できます。

ネストされた配列の例

今回扱うのは、次のような複数階層を持つ配列です。

const arr = [2, 5, 7, [
    4, 5, 4, 7, [
        5, 7, 5
    ], 5
], 2];

この配列は3階層にネストされており、すべての数値を足し合わせると合計は58になります。

サンプルコード

以下が再帰を使った実装例です。

const arr = [2, 5, 7, [
    4, 5, 4, 7, [
        5, 7, 5
    ], 5
], 2];
const calculateSum = (arr, query) => {
    let count = 0;
    for(let i = 0; i < arr.length; i++){
       if(Array.isArray(arr[i])){
          count += calculateSum(arr[i], query);
          continue;
       };
       count += arr[i];
    };
    return count;
};
console.log(calculateSum(arr));

コードの解説

このコードのポイントは以下の通りです。

1. Array.isArray() による判定: 各要素に対して Array.isArray() を使い、それが配列かどうかをチェックします。

2. 再帰呼び出し: 要素が配列だった場合、その配列を引数として自分自身(calculateSum)を再度呼び出します。これにより、どれほど深くネストしていてもすべての要素を処理できます。

3. 数値の加算: 要素が配列でなければ、それは数値なのでそのまま合計(count)に加算します。

出力結果

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

58

別の方法:flat() メソッドを使う

ES2019以降で利用できる Array.prototype.flat() を使えば、再帰を書かずに同様の処理を実現できます。Infinity を指定すると、すべての階層が完全に平坦化されます。

const sum = arr.flat(Infinity).reduce((acc, val) => acc + val, 0);
console.log(sum); // 58

どちらの方法でも結果は同じですが、ネストの深さが不明なデータを汎用的に扱いたい場合は再帰による実装が、簡潔さを重視する場合は flat() との組み合わせが便利です。用途に応じて使い分けましょう。

  1. 【JavaScript】配列内のネストされたオブジェクトの値を合計する方法

    この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d

  2. JavaScriptでネストされた配列の加重和を計算する方法

    ```html 問題 任意の深さまでネストされた配列 arr を唯一の引数として受け取り、その加重和(weighted sum)を計算して返す JavaScript 関数を作成する必要があります。 加重和とは、各要素に「その要素が属するネストの深さ(レベル)」を掛けた値を、配列全体にわたって合計したものです。 入力例と出力例 たとえば、関数に次の配列を渡した場合を考えてみましょう。 const arr = [4, 7, [6, 1, [5, 2]]]; このとき、期待される出力は次のとおりです。 const output = 46; なぜ 46 になるのか? 最上位の要素はレベル1、その中