Imaginons que nous ayons un tableau d'entiers comme celui-ci:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
La moyenne est obtenue avec la formule suivante
A = (1 / n) Σxi (avec i = 1 à n) ... Donc: x1 / n + x2 / n + ... + xn / n
Nous divisons la valeur actuelle par le nombre de valeurs et ajoutons le résultat précédent à la valeur renvoyée.
La signature de la méthode de réduction est
reduce(callback[,default_previous_value])
La fonction de rappel de réduction prend les paramètres suivants:
- p : résultat du calcul précédent
- c : valeur actuelle (à partir de l'index actuel)
- i : valeur d'index de l'élément de tableau actuel
- a : Le réseau réduit actuel
Le deuxième paramètre de réduction est la valeur par défaut ... (Utilisé si le tableau est vide ).
Ainsi, la méthode de réduction moyenne sera:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Si vous préférez, vous pouvez créer une fonction distincte
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Et puis référez-vous simplement à la signature de la méthode de rappel
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Ou Augmentez directement le prototype Array.
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Il est possible de diviser la valeur chaque fois que la méthode de réduction est appelée.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Ou encore mieux , en utilisant le Array.protoype.sum () précédemment défini
méthode, optimisez le processus en n'appelant la division qu'une seule fois :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Puis sur n'importe quel objet Array de la portée:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: un tableau vide avec retour a NaN wish est plus correct que 0 à mon avis et peut être utile dans des cas d'utilisation spécifiques.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
serait tellement plus agréable.