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

【JavaScript】配列の合計値に対する指定パーセント以内となる部分配列を先頭から抽出する方法

問題の概要

まず、次のような数値の配列を用意します。

const numbers = [10,6200,20,20,350,900,26,78,888,10000,78,15000,200,1280,2000,450];

ここで作成する関数は、数値の配列0〜100 の範囲の数値(パーセントを表す値、ここでは仮に x と呼びます)の2つの引数を受け取ります。

関数の役割は、配列全体の合計値に対する x% に達するか、ちょうど下回るまでの間、元の配列の先頭から n 個の要素で構成される部分配列を返すことです。

具体例で理解する

よりシンプルな例を見てみましょう。

const numbers = [12, 10, 6, 8, 4, 2, 8];

この配列の合計は 50 です。第2引数として 25 を指定した場合、返すべき部分配列は「50 の 25%、つまり 12.5」以下となるように、先頭から要素を順に足し合わせたものになります。

したがってこのケースでは、最初の要素 12 のみを含む配列が返されます。2番目の要素 10 を加えると合計が 22 となり、しきい値の 12.5 を超えてしまうためです。

実装コード

それでは実際のコードを書いていきましょう。まず reduce() メソッドで配列の合計値を一度だけ算出し、その後 for ループの中で条件に一致する部分配列を構築します。

コード例

const numbers = [10,6200,20,20,350,900,26,78,888,10000,78,15000,200,1280,2000,450];

const findPercent = (arr, percent) => {
  const sum = arr.reduce((acc, val) => acc + val);
  const part = [];
  let curr = 0;
  for (let i = 0; i < arr.length; i++) {
    curr += arr[i];
    if (curr <= (sum * percent) / 100) {
      part.push(arr[i]);
    } else {
      break;
    }
  }
  return part;
};

console.log(findPercent(numbers, 35));
console.log(findPercent(numbers, 5));
console.log(findPercent(numbers, 65));
console.log(findPercent(numbers, 95));

出力結果

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

[
  10, 6200, 20, 20,
  350, 900, 26, 78,
  888
]
[ 10 ]
[
  10, 6200, 20,
  20, 350, 900,
  26, 78, 888,
  10000, 78
]
[
  10, 6200, 20, 20,
  350, 900, 26, 78,
  888, 10000, 78, 15000,
  200, 1280
]

コードの解説

  • reduce() による合計の事前計算: 配列全体の合計をループの前に1回だけ計算することで、繰り返し処理の中での不要な再計算を避け、パフォーマンスを向上させています。
  • 累積和 curr の管理: for ループ内で変数 curr に要素を順に加算し、現在の累積値を追跡します。
  • しきい値との比較: 累積値が (sum * percent) / 100 以下である限り、要素を結果配列 part に追加します。しきい値を超えた時点で break によりループを即座に抜けるため、無駄な処理が発生しません。

この実装により、常に「先頭から連続した要素のみ」で構成され、合計が指定パーセント以内に収まる部分配列を効率的に取得できます。時間計算量は O(n) であり、配列のサイズに対して線形に動作するため、大きなデータセットにも適用可能です。

  1. 【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説

    JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio

  2. JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説

    Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g