Imaginemos que tenemos una serie de enteros como este:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
El promedio se obtiene con la siguiente fórmula
A = (1 / n) Σxi (con i = 1 a n) ... Entonces: x1 / n + x2 / n + ... + xn / n
Dividimos el valor actual por el número de valores y agregamos el resultado anterior al valor devuelto.
La firma del método reduce es
reduce(callback[,default_previous_value])
La función de reducción de devolución de llamada toma los siguientes parámetros:
- p : resultado del cálculo anterior
- c : valor actual (del índice actual)
- i : valor de índice del elemento de matriz actual
- a : La matriz reducida actual
El segundo parámetro de reducción es el valor predeterminado ... (Se usa en caso de que la matriz esté vacía ).
Entonces, el método de reducción promedio será:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Si lo prefiere, puede crear una función separada
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Y luego simplemente consulte la firma del método de devolución de llamada
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
O aumente el prototipo de matriz directamente ...
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Es posible dividir el valor cada vez que se llama al método de reducción.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
O incluso mejor , usando el Array.protoype.sum () previamente definido
método, optimice el proceso de llamar a la división solo una vez :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Luego, en cualquier objeto Array del alcance:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: una matriz vacía con retorno de un deseo NaN es más correcta que 0 en mi punto de vista y puede ser útil en casos de uso específicos.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Sería mucho más agradable.