让我们假设我们有一个这样的整数数组:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
用下面的公式求平均值
A = (1 / n)Σ喜(i = 1到n) ...同在所以:x1/n + x2/n + 0 ..+ n / 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 . prototype .sum()
方法,优化我只调用一次事业部的过程:)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
然后在作用域的任意Array对象上:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
注意:在我看来,一个返回NaN愿望的空数组比0更正确,在特定的用例中可能有用。