Stellen wir uns vor, wir haben eine Reihe solcher Ganzzahlen:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
Der Durchschnitt wird mit der folgenden Formel erhalten
A = (1 / n) Σxi (mit i = 1 bis n) ... Also: x1 / n + x2 / n + ... + xn / n
Wir teilen den aktuellen Wert durch die Anzahl der Werte und addieren das vorherige Ergebnis zum zurückgegebenen Wert.
Die Signatur der Reduzierungsmethode lautet
reduce(callback[,default_previous_value])
Die Rückruffunktion reduziert die folgenden Parameter:
- p : Ergebnis der vorherigen Berechnung
- c : Aktueller Wert (aus dem aktuellen Index)
- i : Indexwert des aktuellen Array-Elements
- a : Das stromreduzierte Array
Der Parameter der zweiten Reduzierung ist der Standardwert ... (Wird verwendet, wenn das Array leer ist ).
Die durchschnittliche Reduktionsmethode lautet also:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Wenn Sie möchten, können Sie eine separate Funktion erstellen
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Und dann beziehen Sie sich einfach auf die Signatur der Rückrufmethode
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Oder erweitern Sie den Array-Prototyp direkt.
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Es ist möglich, den Wert bei jedem Aufruf der Reduktionsmethode zu teilen.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Oder noch besser mit dem zuvor definierten Array.protoype.sum ()
Methode, optimieren Sie den Prozess, indem Sie die Division nur einmal aufrufen :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Dann auf jedem Array-Objekt des Bereichs:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: Ein leeres Array mit der Rückgabe eines NaN-Wunsches ist aus meiner Sicht korrekter als 0 und kann in bestimmten Anwendungsfällen nützlich sein.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
wäre so viel schöner.