ลองจินตนาการว่าเรามีจำนวนเต็มเช่นนี้:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
ค่าเฉลี่ยจะได้รับด้วยสูตรต่อไปนี้
A = (1 / n) Σxi (กับ i = 1 ถึง n) ... ดังนั้น: x1 / n + x2 / n + ... + xn / n
เราหารค่าปัจจุบันตามจำนวนของค่าและเพิ่มผลลัพธ์ก่อนหน้านี้เป็นค่าที่ส่งคืน
ลายเซ็นวิธีการลดคือ
reduce(callback[,default_previous_value])
ฟังก์ชันลดการเรียกกลับใช้พารามิเตอร์ต่อไปนี้:
- p : ผลลัพธ์ของการคำนวณก่อนหน้า
- c : ค่าปัจจุบัน (จากดัชนีปัจจุบัน)
- i : ค่าดัชนีขององค์ประกอบอาร์เรย์ปัจจุบัน
- a : Array ลดลงในปัจจุบัน
พารามิเตอร์การลดที่สองคือค่าเริ่มต้น ... (ใช้ในกรณีที่อาร์เรย์ว่างเปล่า )
ดังนั้นวิธีลดค่าเฉลี่ยจะเป็น:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
หากคุณต้องการคุณสามารถสร้างฟังก์ชั่นแยกต่างหาก
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
และจากนั้นก็อ้างถึงลายเซ็นวิธีการโทรกลับ
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
หรือเพิ่มต้นแบบ Array โดยตรง ..
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
เป็นไปได้ที่จะแบ่งค่าแต่ละครั้งที่เรียกว่าลด
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
หรือดียิ่งขึ้นโดยใช้Array.protoype.sum ที่กำหนดไว้ก่อนหน้า
วิธีการเพิ่มประสิทธิภาพกระบวนการของฉันโทรหารเพียงครั้งเดียว :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
จากนั้นบนวัตถุ Array ใด ๆ ของขอบเขต:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: อาร์เรย์ว่างเปล่าที่มีการส่งคืนความต้องการของ NaN นั้นถูกต้องมากกว่า 0 ในมุมมองของฉันและสามารถเป็นประโยชน์ในกรณีการใช้งานเฉพาะ
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
จะดีกว่ามาก