Bayangkan kita memiliki array bilangan bulat seperti ini:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
Rata-rata diperoleh dengan rumus berikut
A = (1 / n) Σxi (dengan i = 1 ke n) ... Jadi: x1 / n + x2 / n + ... ... xn / n
Kami membagi nilai saat ini dengan jumlah nilai dan menambahkan hasil sebelumnya ke nilai yang dikembalikan.
Tanda tangan metode pengurangan adalah
reduce(callback[,default_previous_value])
Fungsi mengurangi panggilan balik mengambil parameter berikut:
- p : Hasil perhitungan sebelumnya
- c : Nilai saat ini (dari indeks saat ini)
- i : Nilai indeks elemen array saat ini
- a : Array berkurang saat ini
Parameter reduksi kedua adalah nilai default ... (Digunakan jika array kosong ).
Jadi metode pengurangan rata-rata adalah:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Jika mau, Anda dapat membuat fungsi terpisah
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Dan kemudian cukup merujuk ke tanda tangan metode panggilan balik
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Atau menambah prototipe Array secara langsung ..
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Dimungkinkan untuk membagi nilai setiap kali metode pengurangan dipanggil ..
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Atau bahkan lebih baik , menggunakan Array.protoype.sum () yang didefinisikan sebelumnya
metode, mengoptimalkan proses saya memanggil divisi hanya sekali :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Kemudian pada objek array apa pun dari ruang lingkup:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: array kosong dengan mengembalikan harapan NaN lebih benar daripada 0 dalam sudut pandang saya dan dapat berguna dalam kasus penggunaan tertentu.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
akan jauh lebih baik.