假设我们有一个像这样的整数数组:
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:电流减少的数组
第二个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原型。
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()
方法,我只调用一次优化过程:)
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]
会好得多。