【JavaScript】配列の部分和(後方からの累積和)を求める方法を解説
問題
数値の配列を受け取り、新しい配列を構築して返すJavaScript関数を作成します。戻り値となる配列の各要素には、元の配列において「その位置より右側にあるすべての要素(自分自身を含む)」の合計が格納されます。
コード例
以下が実際のコードです。
const arr = [5, 6, 1, 3, 8, 11];
const partialSum = (arr = []) => {
let sum = arr.reduce((acc, val) => acc + val);
const res = [];
let x = 0;
if(arr.length === 0){
return [0];
}
for(let i = 0; i <= arr.length; i += 1) {
res.push(sum);
x = arr[i];
sum -= x;
};
return res;
};
console.log(partialSum(arr));
出力結果
[ 34, 29, 23, 22, 19, 11, 0 ]
コードの解説
この関数の仕組みを順番に見ていきましょう。
1. 全体の合計を先に求める
reduceメソッドを使い、配列内の全要素の合計を計算します。この例では 5 + 6 + 1 + 3 + 8 + 11 = 34 となります。
2. 空配列への対応
入力が空の配列だった場合は [0] を返して処理を終了します。これにより、予期しないエラーを防ぐことができます。
3. ループで部分和を記録していく
forループの中では、まず現在の合計値を結果配列 res にpushし、その後、配列の先頭側の要素を順に合計値から差し引いていきます。こうすることで、「各位置から右端までの合計」が左から順番に記録されていきます。
4. 最後の0について
ループ条件が i <= arr.length となっているため、すべての要素を引き終わった後の合計値「0」も結果に含まれます。もし末尾の0が不要な場合は、ループ条件を i < arr.length に変更するだけで除外できます。
reduceRightを使った別解
後ろから累積和を計算したい場合は、reverseとmapを組み合わせた次のような書き方も可能です。
const partialSumAlt = (arr = []) => {
let sum = 0;
return [...arr].reverse().map(num => sum += num).reverse();
};
console.log(partialSumAlt([5, 6, 1, 3, 8, 11]));
// 結果: [ 34, 29, 23, 22, 19, 11 ]
こちらの書き方はコードが簡潔になる一方、元の実装と違い末尾に0が含まれない点に注意してください。必要であれば concat(0) などで追加することができます。
-
【JavaScript】配列内のネストされたオブジェクトの値を合計する方法
この記事では、JavaScriptを使って、配列内にネストされた(入れ子構造の)オブジェクトの値を合計する方法を解説します。サンプルコードでは、JSONデータの複数階層に格納された数値(costNum)を順番に取り出し、その合計をブラウザ上に表示します。 コード例 <!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=d
-
JavaScriptで挿入ソートを実装して数値配列を昇順に並べ替える方法
挿入ソートとは挿入ソート(Insertion Sort)は、シンプルで直感的なソートアルゴリズムの一つです。配列を「整列済みの部分」と「未整列の部分」に分け、未整列部分の要素を一つずつ取り出して、整列済み部分の適切な位置に挿入していくことで全体を並べ替えます。データ量が少ない場合や、すでにほぼ整列されたデータに対しては非常に効率的に動作するため、実務でも場面を選んで活用されています。問題の概要今回は、JavaScript関数を作成します。この関数は、第一引数(唯一の引数)として数値の配列 arr を受け取ります。関数の役割は、挿入ソートのアルゴリズムを使用して、この数値配列を昇順(小さい順)に