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

JavaScriptのreduce()を使って累積和より大きい配列要素だけを残す方法

JavaScriptで、数値の配列を受け取る関数を作成することを考えてみましょう。この関数の役割は、元の配列の中から「その要素までの累積和(それ以前の全要素の合計)」よりも大きい値を持つすべての要素を取り出し、新しい配列として返すことです。さらに重要な条件として、この問題は Array.prototype.reduce() メソッドを使って解決する必要があります。

コード例

それでは、実際に関数を実装してみましょう。

const arr = [1, 2, 30, 4, 5, 6];
const retainGreaterElements = arr => {
    let res = [];
    arr.reduce((acc, val) => {
        return (val > acc && res.push(val), acc + val);
    }, 0);
    return res;
}
console.log(retainGreaterElements(arr));

コードの仕組み

この実装のポイントは、reduce()のコールバック関数内でのカンマ演算子の使い方にあります。処理の流れは以下の通りです。

  • 初期値として 0 を指定し、アキュムレータ acc にはこれまでの要素の合計が蓄積されていきます。
  • 各要素 val について、まず val > acc という比較を行います。
  • 比較が true の場合のみ res.push(val) が評価され、結果配列に要素が追加されます。false の場合は何も行われません(短絡評価の活用)。
  • 最後にカンマ演算子によって acc + val が返され、次のイテレーションへ新しい累積和が渡されます。

出力

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

[1, 2, 30]

なぜ [1, 2, 30] になるのか

処理を順に追うと理解しやすくなります。

  1. 1:累積和 0 より大きい → 追加(累積和は 1)
  2. 2:累積和 1 より大きい → 追加(累積和は 3)
  3. 30:累積和 3 より大きい → 追加(累積和は 33)
  4. 4, 5, 6:いずれも累積和 33 より小さいため除外

このように、reduce() を単なる集計用途にとどまらず、副作用を伴うフィルタリングにも応用できるのがポイントです。ただし、可読性を重視する場合は通常のループや filter() との組み合わせを検討するのも良いでしょう。

  1. JavaScriptのArray.reduce()メソッドとは?基本的な使い方を解説

    Array.reduce()メソッドとはArray.reduce()は、配列の各要素に対して開発者が指定した関数(コールバック関数)を順番に適用し、最終的に単一の値を出力するJavaScriptの配列メソッドです。この処理は「畳み込み(リデュース)」とも呼ばれ、配列内のすべての要素を集約して一つの結果を得たい場合に非常に便利です。たとえば、配列 [1, 2, 3, 4] の合計を求める場合、reduce()メソッドは左から右へ各要素を順に処理していき、最終的な結果として 10 という単一の値を返します。基本構文array.reduce((accumulator, currentValue) =

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

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