Array.aggregate (集約関数)

  1. 文法
  2. 詳細
  3. 引数
  4. 戻り値

1. 文法

メンバ型
関数
メンバ所有者
global.Array インスタンス
呼び出し
instance.aggregate( stateFunc, finalFunc, initCond, args* )

2. 詳細

配列要素を集約し、その結果を取得します。集約方法は状態遷移関数最終計算関数に依存します。

当該コンテキスト(thisオブジェクト)は変更されません。

この関数は、内部状態値を一時変数として保持します。状態遷移関数と最終計算関数は、内部状態値と配列の各要素から、集約結果を算出します。配列の各要素は、先頭から順に状態遷移関数によって処理されます。全要素が処理された後、最終計算関数によって集約結果が決定されます。この関数の処理イメージは以下のようになります。

stateFunc( initial-condition, first-data-item ) ---> next-internal-state
stateFunc( internal-state, next-data-item ) ---> next-internal-state
stateFunc( internal-state, next-data-item ) ---> next-internal-state
...
stateFunc( internal-state, last-data-item ) ---> next-internal-state
finalFunc( internal-state ) ---> aggregate-value

なお、この関数はPostgreSQLのCREATE AGGREGATE句を参考にしました。

3. 引数

stateFunc (Function)
配列の各要素に対して実行する状態遷移関数を指定します。
状態遷移関数は、二つ以上の引数を持つTJS2関数オブジェクトです。状態遷移関数の一つめの引数は、内部状態値です。これは内部の状態を保持するための一時変数で、一つ前の要素に対する状態遷移関数の戻り値(先頭要素の場合は初期条件)が渡されます。二つめの引数は、計算対象要素です。三つめ以降の引数は、Array.aggregate自身のオプション引数そのものです。戻り値は、新しい内部状態値です。この新しい内部状態値が、次の要素に対する状態遷移関数(最終要素の場合は最終計算関数)の第一引数に渡されます。
finalFunc (Function)
最終計算関数を指定します。
最終計算関数は、二つ以上の引数を持つTJS2関数オブジェクトです。最終計算関数の一つめの引数は、全ての配列要素に対する状態遷移関数実行後の内部状態値です。内部状態値についてはstateFuncを参照してください。二つめの引数は、将来のために予約されています。現バージョンでは使用しないでください。三つめ以降の引数は、Array.aggregate自身のオプション引数そのものです。戻り値は、新しい内部状態値です。この新しい内部状態値が、Array.aggregate自身の戻り値となります。
最終計算関数が必要ない場合にはvoidを指定してください。
initCond (Any)
内部状態値の初期値を指定します。配列の先頭要素に対する状態遷移関数の第一引数に渡されます。初期値の型は何でも構いません。
args* (Any)
オプション引数を指定します。必須ではありません。内部状態値等のほかに、必要なパラメータがあれば、それらを指定します。ここで指定されたオプション引数は、そのまま状態遷移関数最終計算関数に渡されます。

4. 戻り値

集約結果を返します。最終計算関数の戻り値が集約結果となります。最終計算関数が指定されなかった(voidが指定された)場合には、全要素に対する状態遷移関数実行後の最終内部状態値が集約結果となります。

5. 例

var arr = [ 2, 5, 1, 2, 1, 3 ];
// 要素ごとにインクリメントする状態遷移関数
var sfunc_cnt = function(internalState)
{
  return internalState + 1;
};

// 要素数を返す集約関数(arr.countと同じ)
var count = arr.aggregate(sfunc_cnt, void, 0);
// 小さいほうを返す状態遷移関数
var sfunc_min = function(internalState, value)
{
  return (internalState < value) ? internalState : value;
};

// 最小値を返す集約関数
var minimum = arr.aggregate(sfunc_min, void, arr[0]);
// 和を返す状態遷移関数
var sfunc_sum = function(internalState, value)
{
  return internalState + value;
};

// 平均値を返す最終計算関数
var ffunc_avg = function(internalState)
{
  //この関数は、Arrayインスタンスメソッドのコンテキストで実行されるので、
  //Arrayインスタンスのcountプロパティを参照することができる。
  return (count > 0) ? (internalState / count) : void;
};

// 総和を返す集約関数
var summary = arr.aggregate(sfunc_sum, void, 0);

// 平均値を返す集約関数
var average = arr.aggregate(sfunc_sum, ffunc_avg, 0);
// 差の二乗和を返す状態遷移関数
var sfunc_2diff = function(internalState, value, avg)
{
  var s = value - avg;
  return internalState + s * s;
};

// 分散を返す集約関数
var variance = arr.aggregate(sfunc_2diff, ffunc_avg, 0, average);