假设我们有一个这样的整数数组:
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 : 当前缩减的 Array
第二个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();// -> 4
[2, 6].sum();// -> 8
注意:在我看来,返回 NaN 愿望的空数组比 0 更正确,并且在特定用例中很有用。