reduce() và reduceRight()
Các phương thức reduce() và reduceRight() kết hợp các phần tử của một mảng, sử dụng hàm bạn chỉ ra, để sinh ra một
giá trị đơn. Đây là một hoạt động phổ biến trong lập trình chức năng và cũng đi theo cái tên “inject” và “fold.”
Các ví dụ giúp minh họa nó làm việc như thế nào:
let a = [1,2,3,4,5];
a.reduce((x,y) => x+y, 0) // => 15; the sum of the values
a.reduce((x,y) => x*y, 1) // => 120; the product of the values
a.reduce((x,y) => (x > y) ? x : y) // => 5; the largest of the values
reduce() lấy 2 đối số. Cái đầu tiên là hàm cái thực hiện hoạt động giảm. Nhiệm vụ của hàm giảm này là đến chừng mực
nào đó kết hợp hay giảm 2 giá trị thành một giá trị đơn và để trả về giá trị được giảm đó. Trong các ví dụ chúng ta
vừa thể hiện ở đây, các hàm kết hợp 2 giá trị bằng cách cộng chúng, nhân chúng và chọn cái lớn nhất. Đối số (tùy
chọn) thứ hai là một giá trị ban đầu để truyền tới hàm.
Các hàm sử dụng với reduce() là khác so với các hàm sử dụng với forEach() và map().Giá trị quen thuộc, chỉ mục, và
các giá trị mảng được truyền như đối số thứ hai, ba và tư. Đối số đầu tiên là kết quả tích lũy của giảm trước đó.
Trên lời gọi đầu tiên tới hàm, đối số đầu tiên này là giá trị ban đầu bạn đã truyền như đối số thứ hai tới reduce().
Trên các lời gọi tiếp theo, nó là giá trị trả về bởi khởi động trước của hàm. Trong ví dụ đầu tiên, hàm giảm được
gọi đầu tiên với các đối số 0 và 1. Nó cộng những cái này và trả về 1. Nó sau đó được gọi một lần nữa với các đối
só 1 và 2 và trả về 3. Tiếp theo, nó tính toán 3+3=6 sau đó 6+4=10 và cuối cùng 10+5=15. Giá trị cuối cùng này, trở
thành giá trị trả về của reduce().
