JavaScriptで配列を累積和(部分和)の配列に変換する方法
JavaScriptでは、数値の配列を受け取り、累積和(部分和)からなる同じ長さの新しい配列を返す処理が必要になることがあります。この記事では、その実装方法をわかりやすく解説します。
累積和(部分和)とは
まず、次のような数値の配列を例に考えてみましょう。
const arr = [1, 1, 5, 2, -4, 6, 10];
この配列に対して、「各要素が、その位置までのすべての要素の合計」となる新しい配列を作成します。つまり、出力は次のようになります。
const output = [1, 2, 7, 9, 5, 11, 21];
それぞれの要素を見てみると、以下のように計算されていることがわかります。
- 1番目:1 → 1
- 2番目:1 + 1 → 2
- 3番目:1 + 1 + 5 → 7
- 4番目:1 + 1 + 5 + 2 → 9
- 5番目:1 + 1 + 5 + 2 + (-4) → 5
- 6番目:1 + 1 + 5 + 2 + (-4) + 6 → 11
- 7番目:1 + 1 + 5 + 2 + (-4) + 6 + 10 → 21
partialSum() 関数の実装
それでは、この変換を行う 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));コードの仕組み
このコードでは、元の配列を先頭から順に走査し、各位置に対して「直前の累積値 + 現在の要素」を結果配列に代入していきます。最初の要素には前の値が存在しないため、そのまま格納しています。
コンソールに出力すると、次の結果が得られます。
[ 1, 2, 7, 9, 5, 11, 21 ]
別解:reduce() を使った簡潔な書き方
より簡潔に書きたい場合は、reduce() メソッドを利用することもできます。
const partialSum = (arr) =>
arr.reduce((acc, num) => {
acc.push(num + (acc.length ? acc[acc.length - 1] : 0));
return acc;
}, []);
console.log(partialSum([1, 1, 5, 2, -4, 6, 10]));
// [1, 2, 7, 9, 5, 11, 21]こちらの方法では、アキュムレータとして結果配列自体を使い、最後の要素(直前の累積値)に現在の数値を加算しながら追加していきます。
まとめ
累積和への変換は、forEach() を使う方法でも reduce() を使う方法でも簡単に実装できます。どちらも計算量は O(n) なので、大きな配列でも効率的に動作します。用途や可読性の好みに応じて使い分けるとよいでしょう。
-
JavaScriptで配列をSet(セット)に変換する方法
JavaScriptで配列をSetに変換するときの基本JavaScriptでは、Setオブジェクトを使うことで、配列から重複しない一意の値だけを持つコレクションを簡単に作成できます。SetはES6(ECMAScript 2015)で導入された組み込みオブジェクトで、同じ値が複数回追加されても自動的に1つにまとめられるのが特徴です。変換自体は非常にシンプルで、new Set(配列)と書くだけで完了します。コード例:配列からSetへの変換以下は、重複を含む配列をSetに変換して画面に表示するサンプルコードです。<!DOCTYPE html> <html lang=ja> &
-
JavaScriptで配列の偶数を2乗・奇数を平方根に変換して合計を求める方法
問題 数値の配列を受け取るJavaScript関数を作成する必要があります。この関数は、配列内の各数値に対して「偶数であれば2乗」「奇数であれば平方根」を求め、それらすべての合計を小数点以下2桁に丸めて返します。 解決のアプローチ この問題は、Array.prototype.map()とArray.prototype.reduce()を組み合わせると簡潔に実装できます。まずmap()で各要素を変換した新しい配列を作り、続いてreduce()でその配列の合計を計算します。最後にMath.round()を使って小数点以下2桁に丸めます。 コード例 以下が実際のコードです − const arr