Diyelim ki böyle bir tamsayı dizimiz var:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
Ortalama aşağıdaki formülle elde edilir
A = (1 / n) Σxi (i = 1 ila n ile) ... Yani: x1 / n + x2 / n + ... + xn / n
Mevcut değeri değer sayısına böleriz ve önceki sonucu döndürülen değere ekleriz.
Küçültme yöntemi imzası:
reduce(callback[,default_previous_value])
Geri aramayı azaltma işlevi aşağıdaki parametreleri alır:
- p : Önceki hesaplamanın sonucu
- c : Geçerli değer (geçerli dizinden)
- i : Geçerli dizi öğesinin dizin değeri
- a : Akım azaltılmış Dizi
İkinci azaltma parametresi varsayılan değerdir ... (Dizinin boş olması durumunda kullanılır ).
Ortalama azaltma yöntemi şöyle olacaktır:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
İsterseniz ayrı bir işlev oluşturabilirsiniz
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Ve sonra sadece geri arama yöntemi imzasına bakın
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Veya Array prototipini doğrudan artırın ..
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
İndirgeme yöntemi her çağrıldığında değeri bölmek mümkündür.
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Ya da daha iyisi , daha önce tanımlanmış Array.protoype.sum () yöntemini kullanarak
yöntemi, benim bölünme sadece bir kez çağrı sürecini optimize :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Sonra kapsamın herhangi bir Array nesnesinde:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
Not: NaN isteği döndüren boş bir dizi benim görüşüme göre 0'dan daha doğrudur ve belirli kullanım durumlarında faydalı olabilir.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
çok daha güzel olurdu.