Wyobraźmy sobie, że mamy taką tablicę liczb całkowitych:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
Średnią uzyskuje się za pomocą następującego wzoru
A = (1 / n) Σxi (gdzie i = 1 do n) ... Więc: x1 / n + x2 / n + ... + xn / n
Bieżącą wartość dzielimy przez liczbę wartości i dodajemy poprzedni wynik do zwracanej wartości.
Sygnatura metody to
reduce(callback[,default_previous_value])
Funkcja redukcji wywołania zwrotnego przyjmuje następujące parametry:
- p : Wynik poprzedniego obliczenia
- do : Bieżąca wartość (z aktualnego indeksu)
- ja : wartość indeksu bieżącego elementu tablicy
- za : Bieżąca zredukowana tablica
Drugi parametr redukcji jest wartością domyślną ... (używana w przypadku, gdy tablica jest pusta ).
Zatem średnia metoda redukcji będzie:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Jeśli wolisz, możesz utworzyć oddzielną funkcję
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Następnie wystarczy odwołać się do sygnatury metody wywołania zwrotnego
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Lub bezpośrednio rozszerz prototyp macierzy.
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Wartość można podzielić za każdym razem, gdy wywoływana jest metoda redukcji.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Lub jeszcze lepiej , używając wcześniej zdefiniowanej Array.protoype.sum ()
metoda, zoptymalizuj proces moje wywołanie podziału tylko raz :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Następnie na dowolnym obiekcie Array z zakresu:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: pusta tablica ze zwrotem życzenia NaN jest z mojego punktu widzenia bardziej poprawna niż 0 i może być przydatna w określonych przypadkach użycia.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
byłoby o wiele ładniejsze.