让我们想象我们有一个像这样的整数数组:
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
参数是默认值...(在数组为空的情况下使用)。
因此,求平均值的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()方法,通过仅调用一次除法来优化过程 :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
然后,在任何作用域的Array对象上:
[2, 6].avg()
[2, 6].sum()
NB:在我看来,返回NaN的空数组比返回0更正确,并且在特定的用例中可能会很有用。
var elmt = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
这样会更好。 - James M