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

JavaScriptの配列で指定範囲の合計を求めるsumRange関数の実装方法

本記事では、Array.prototypeオブジェクト上に定義できる配列関数として、開始インデックスから終了インデックスまでの要素(両端を含む)の合計値を返すsumRangeメソッドの実装方法を解説します。

実装の要件

  • 開始インデックスと終了インデックスを引数として受け取る
  • 範囲内のすべての要素(開始・終了の両端を含む)を合計する
  • 開始インデックスが終了インデックスより大きい場合は、合計値として0を返す
  • 引数が省略された場合に備えてデフォルト値を設定する

サンプルコード(forループ版)

Array.prototype.sumRange = function(start = 0, end = this.length - 1){
  let sum = 0;
  if(start > end){
    return sum;
  }
  for(let i = start; i <= end; i++){
    sum += this[i];
  }
  return sum;
};

const arr = [1, 2, 3, 4, 5, 6, 7];
console.log(arr.sumRange(0, 4));

出力結果

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

15

これは、インデックス0〜4の要素である 1 + 2 + 3 + 4 + 5 の合計です。

コードの解説

  • thisは、メソッドの呼び出し元である配列自身(arr)を参照します。
  • start > end の場合は有効な範囲が存在しないため、初期値のまま0を返します。
  • forループでカウンタ変数 i を start から end まで動かし、各要素を累積変数 sum に加算していきます。

sliceとreduceを使った簡潔な書き方

よりモダンな記述にしたい場合は、slicereduceを組み合わせる方法もあります。

Array.prototype.sumRange = function(start = 0, end = this.length - 1){
  if(start > end) return 0;
  return this.slice(start, end + 1).reduce((acc, cur) => acc + cur, 0);
};

sliceは終了位置を排他的に扱うため、end + 1 を指定することで両端を含む範囲を取り出し、reduceで合計を計算しています。

プロトタイプ拡張時の注意点

組み込みオブジェクトのプロトタイプを直接拡張すると、他のライブラリとの名前の衝突や、将来の仕様変更による影響を受ける可能性があります。実務では、独立したユーティリティ関数として切り出すか、Symbolキーを利用するなどの対策を検討することをおすすめします。

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

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

  2. JavaScriptで範囲内のすべての数値の合計を求める方法

    問題範囲を指定する配列を受け取るJavaScript関数を作成する必要があります。この関数は、指定された範囲に含まれるすべての自然数(両端の数値も含む)の合計を計算し、その結果を返すものとします。解決策:ループを使った実装以下のコードでは、forループを使って下限値から上限値まで順番に足し合わせていく、シンプルな実装例を示します。const range = [4, 67];const findSum = ([l, h]) => {    let sum = 0;    for(let i = l; i <