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

【初心者向け】JavaScriptのforEachで部分和(累積和)の配列を作成する方法

次のような数値の配列があるとします。

const arr = [1, 1, 5, 2, -4, 6, 10];

ここで作成したいのは、同じサイズの新しい配列を返す関数です。ただし、新しい配列の各要素には、元の配列の先頭からその位置までの全要素の合計が格納されるようにします。

つまり、期待される出力は次のとおりです。

const output = [1, 2, 7, 9, 5, 11, 21];

それでは、partialSum() 関数を実装してみましょう。完全なコードは以下のとおりです。

コード例

const arr = [1, 1, 5, 2, -4, 6, 10];

const partialSum = (arr) => {
    const output = [];
    arr.forEach((num, index) => {
        if (index === 0) {
            output[index] = num;
        } else {
            output[index] = num + output[index - 1];
        }
    });
    return output;
};

console.log(partialSum(arr));

コードの仕組み

この関数では、forEach() を使って配列を先頭から順に走査し、そのたびに output 配列へ「現在の数値 + 直前までの累積値」という新しい値を代入していきます。

  • 最初の要素(index === 0):それより前の要素が存在しないため、値をそのまま output 配列に代入します。
  • 2番目以降の要素:現在の数値に output[index - 1](直前までの累積和)を加算して代入します。

このように、直前の結果を再利用することで、毎回先頭から合計を計算し直す必要がなく、O(n) の計算量で効率的に処理できます。

出力結果

このコードを実行すると、コンソールには次のように表示されます。

[ 1, 2, 7, 9, 5, 11, 21 ]

補足:map() を使ったより簡潔な書き方

forEach() の代わりに map() を使えば、外部変数で累積値を保持しながら、より短いコードで同じ結果を得ることもできます。

const partialSum = (arr) => {
    let sum = 0;
    return arr.map((num) => (sum += num));
};

console.log(partialSum([1, 1, 5, 2, -4, 6, 10]));
// 出力: [ 1, 2, 7, 9, 5, 11, 21 ]

状況に応じて forEach 版と map 版を使い分けることで、可読性の高いコードを書けます。

  1. JavaScriptでリンクリスト(連結リスト)を作成する方法

    連結リスト(リンクリスト)は、各要素が「データ」と「次の要素への参照」を持つデータ構造です。配列と異なり、要素の挿入や削除を効率的に行えるのが大きな特徴です。この記事では、JavaScriptを使ってシンプルな連結リストを実装する方法を、サンプルコードとともにわかりやすく解説します。 LinkedListクラスとNodeクラスの定義 まず、headをnullで初期化するコンストラクタを持つシンプルなクラスを定義することから始めましょう。あわせて、LinkedListクラスのプロトタイプに、連結リストの各ノードを表すNodeクラスも定義します。 例 class LinkedList { &nbs

  2. JavaScriptでHTMLリストを並べ替える方法を初心者向けに解説

    Webページ上のリスト(<ul>や<ol>)を、ボタンをクリックしたときに自動的にアルファベット順へ並べ替えたいケースはよくあります。JavaScriptを使えば、ページを再読み込みすることなく、DOMを直接操作してリスト項目の順序を入れ替えることができます。ここでは、「クリックすると並べ替えが実行されるボタン」を持つシンプルなサンプルを紹介します。サンプルコード<!DOCTYPE html> <html> <body> <h1>リスト並べ替えの例</h1> <button>クリックして並べ替え&l