Il tuo programma non ha funzionato perché, a
ha il valore accumulato dalla precedente chiamata di funzione. La prima volta, verranno utilizzati i primi due valori dell'array. Quindi sum
diventerà 17
(2 + 15
). Poiché non si restituisce nulla dalla funzione, verrà restituito undefined
, per impostazione predefinita, e verrà utilizzato come valore per a
nella chiamata successiva. Quindi, la valutazione va come questo
a: 2, b: 15 => 17
a: undefined, b: 7 => NaN
Quindi, sum
avrà NaN
, dal momento undefined + 7
rende così. Qualsiasi operazione numerica su NaN
, darà sempre NaN
, ecco perché NaN/this.length
, fornisce NaN
. È possibile correggere il programma, semplicemente restituendo il valore corrente di sum
ogni volta che viene chiamata la funzione, in modo che alla chiamata di funzione successiva, a
abbia il valore accumulato correttamente.
Array.prototype.average = function() {
var sum = 0;
this.reduce(function(a, b) {
sum = a + b;
return sum;
});
return sum/this.length;
};
Ma non stiamo facendo uso del potere e la flessibilità di reduce
qui. Qui ci sono due punti importanti da considerare quando si utilizza reduce
.
reduce
accetta un secondo parametro che indica il valore iniziale da utilizzare. Quando è possibile, specificalo.
Il primo parametro nella funzione passata a reduce
accumula il risultato e questo verrà restituito, infine, sfruttarlo. Non è necessario utilizzare una variabile separata per tenere traccia dei risultati.
Così il vostro codice sarà meglio così
Array.prototype.average = function() {
var sum = this.reduce(function(result, currentValue) {
return result + currentValue
}, 0);
return sum/this.length;
};
console.log([2, 15, 7].average());
# 8
reduce
in realtà funziona in questo modo. Esso scorre l'array e passa il valore corrente come secondo parametro alla funzione e il risultato accumulato corrente come primo parametro e il valore restituito dalla funzione verrà memorizzato nel valore accumulato.Così, la somma è effettivamente trovato in questo modo
result: 0 , currentValue: 2 => 2 (Initializer value `0`)
result: 2 , currentValue: 15 => 17
result: 17, currentValue: 7 => 24
Da quando è a corto di valori dalla matrice, 24
verrà restituito come risultato della reduce
, che sarà memorizzato in sum
.
dal codice, si potrebbe supporre che si prendono di mira un browser moderno. Suggerirei di usare 'Object.defineProperty' per estendere' Array.prototype'. (e testando che il metodo non esiste prima). Si potrebbe persino rendere il codice più generico per funzionare '(call/apply)' con altri oggetti. – Xotic750