【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) であり、配列のサイズに対して線形に動作するため、大きなデータセットにも適用可能です。
-
【初心者向け】JavaScriptのArray.from()メソッドの使い方を実例で解説
JavaScript の Array.from() メソッドは、length プロパティを持つオブジェクト(配列風オブジェクト)や、文字列・Map・Set などの反復可能(イテラブル)なオブジェクトから、新しい Array オブジェクトを生成して返すためのメソッドです。元のオブジェクトは変更されず、常に新しい配列インスタンスが返されます。 基本構文 Array.from(obj, mapFunction, val) パラメータの説明 obj:配列へ変換したい対象のオブジェクト。配列風オブジェクト(length プロパティを持つもの)や反復可能なオブジェクトを指定します。 mapFunctio
-
JavaScriptのArray.from()メソッドとは?使い方と実例をわかりやすく解説
Array.from()メソッドは、配列風オブジェクト(array-like)や反復可能オブジェクト(iterable)から、新しい配列オブジェクトを作成するための便利なメソッドです。文字列、Map、Set、NodeListなど、さまざまなデータを手軽に配列へ変換できます。 Array.from()の基本的な動作 例えば、文字列「HelloWorld」に対してArray.from()を使用すると、1文字ずつ分割された新しい配列が生成されます。以下に実際のコード例を示します。 サンプルコード <!DOCTYPE html> <html lang="ja"&g