Hãy tưởng tượng chúng ta có một loạt các số nguyên như thế này:
var values = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11];
Trung bình thu được với công thức sau
A = (1 / n) Σxi (với i = 1 đến n) ... Vậy: x1 / n + x2 / n + ... + xn / n
Chúng tôi chia giá trị hiện tại cho số lượng giá trị và thêm kết quả trước đó vào giá trị được trả về.
Chữ ký phương thức rút gọn là
reduce(callback[,default_previous_value])
Hàm gọi lại giảm có các tham số sau:
- p : Kết quả tính toán trước
- c : Giá trị hiện tại (từ chỉ mục hiện tại)
- i : Giá trị chỉ mục của phần tử mảng hiện tại
- a : Mảng giảm hiện tại
Tham số giảm thứ hai là giá trị mặc định ... (Được sử dụng trong trường hợp mảng trống ).
Vì vậy, phương pháp giảm trung bình sẽ là:
var avg = values.reduce(function(p,c,i,a){return p + (c/a.length)},0);
Nếu bạn thích bạn có thể tạo một chức năng riêng biệt
function average(p,c,i,a){return p + (c/a.length)};
function sum(p,c){return p + c)};
Và sau đó chỉ cần tham khảo chữ ký phương thức gọi lại
var avg = values.reduce(average,0);
var sum= values.reduce(sum,0);
Hoặc Augment nguyên mẫu Array trực tiếp ..
Array.prototype.sum = Array.prototype.sum || function (){
return this.reduce(function(p,c){return p+c},0);
};
Có thể chia giá trị mỗi lần phương thức rút gọn được gọi là ..
Array.prototype.avg = Array.prototype.avg || function () {
return this.reduce(function(p,c,i,a){return p+(c/a.length)},0);
};
Hoặc thậm chí tốt hơn , bằng cách sử dụng Array.protoype.sum () được xác định trước đó
phương pháp, tối ưu hóa quá trình tôi gọi bộ phận chỉ một lần :)
Array.prototype.avg = Array.prototype.avg || function () {
return this.sum()/this.length;
};
Sau đó, trên bất kỳ đối tượng Array nào của phạm vi:
[2, 6].avg();// -> 4
[2, 6].sum();// -> 8
NB: một mảng trống có trả về một điều ước NaN đúng hơn 0 theo quan điểm của tôi và có thể hữu ích trong các trường hợp sử dụng cụ thể.
var elmt = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
sẽ đẹp hơn rất nhiều