Immaginiamo di avere un array di numeri interi come questo:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
La media è ottenuta con la seguente formula
A = (1 / n) Σxi (con i = 1 a n) ... Quindi: x1 / n + x2 / n + ... + xn / n
Dividiamo il valore corrente per il numero di valori e aggiungiamo il risultato precedente al valore restituito.
La firma del metodo di riduzione è
reduce(callback[,default_previous_value])
La funzione di riduzione della richiamata accetta i seguenti parametri:
- p : risultato del calcolo precedente
- c : valore corrente (dall'indice corrente)
- i : valore indice dell'elemento della matrice corrente
- a : La matrice ridotta corrente
Il parametro del secondo riduttore è il valore predefinito ... (Usato nel caso in cui l'array sia vuoto ).
Quindi il metodo di riduzione medio sarà:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Se preferisci, puoi creare una funzione separata
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Quindi fai semplicemente riferimento alla firma del metodo di callback
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Oppure aumenta direttamente il prototipo di array ..
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
È possibile dividere il valore ogni volta che viene chiamato il metodo di riduzione.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
O ancora meglio , usando il precedentemente definito Array.protoype.sum ()
metodo, ottimizza il processo chiamando la divisione solo una volta :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Quindi su qualsiasi oggetto Array dell'ambito:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: un array vuoto con ritorno di un desiderio NaN è più corretto di 0 dal mio punto di vista e può essere utile in casi d'uso specifici.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
sarebbe molto più bello.