次のような整数の配列があるとします。
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
平均は次の式で得られます
A =(1 / n)Σxi (i = 1からnまで) ...したがって:x1 / n + x2 / n + ... + xn / n
現在の値を値の数で割り、前の結果を戻り値に追加します。
reduceメソッドのシグネチャは
reduce(callback[,default_previous_value])
reduceコールバック関数は、次のパラメーターを取ります。
- p:前回の計算結果
- c:現在の値(現在のインデックスから)
- i:現在の配列要素のインデックス値
- a:現在の縮小配列
2番目のreduceのパラメーターはデフォルト値です...(配列が空の場合に使用されます)。
したがって、平均的な削減方法は次のようになります。
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
必要に応じて、別の関数を作成できます
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
そして、単にコールバックメソッドシグネチャを参照します
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
または、直接配列プロトタイプを拡張します。
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
reduceメソッドが呼び出されるたびに値を除算することが可能です。
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
または、以前に定義されたArray.protoype.sum()を使用してさらに良い
メソッド、プロセスを最適化して、部門を1回だけ呼び出します:)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
次に、スコープの任意のArrayオブジェクトで:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
注意:NaNウィッシュを返す空の配列は、私の見解では0よりも正確であり、特定のユースケースで役立ちます。
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
とても良いでしょう