reduce() và reduceRight() (tiếp tục)
Bạn có thể nhận thấy rằng lời gọi thứ ba tới reduce() trong ví dụ này chỉ có một đối số đơn: không có giá trị ban
đầu chỉ ra. Khi bạn khởi động reduce() như cái này với không giá trị ban đầu, nó sử dụng phần tử đầu tiên của mảng
như giá trị ban đầu. Cái này có nghĩa rằng lời gọi đầu tiên tới hàm reduction sẽ có các phần tử mảng đầu tiên và
thứ hai như các đối số đầu tiên và thứ hai của nó. Trong các ví dụ sum và product, chúng ta có thể đã bỏ qua đối
số giá trị ban đầu.
Gọi reduce() trên một mảng rỗng với không đối số giá trị ban đầu gây ra một TypeError. Nếu bạn gọi nó với chỉ một
giá trị – hoặc một mảng với một phần tử và không giá trị ban đầu hoặc một mảng rỗng và một giá trị ban đầu – nó
đơn giản trả về giá trị đó mà không từng gọi hàm reduction.
reduceRight() làm việc chính như reduce(), ngoại trừ rằng nó xử lí mảng từ chỉ mục cao nhất tới thấp nhất (phải
sang trái), hơn là từ thấp nhất tới cao nhất. Bạn có thể muốn làm cái này nếu hoạt động reduction có liên đới
phải sang trái, ví dụ:
// Compute 2^(3^4). Exponentiation has right-to-left precedence
let a = [2, 3, 4];
a.reduceRight((acc,val) => Math.pow(val,acc)) // => 2.4178516392292583e+24
Chú ý rằng cả reduce() và reduceRight() không chấp nhận một đối số tùy chọn cái chỉ ra giá trị this trên đó hàm
reduction sẽ được khởi động. Đối số giá trị ban đầu tùy chọn chiếm vị trí của nó. Xem phương thức Function.bind()
(các học phần sau) nếu bạn cần hàm reduction của bạn được khởi động như một phương thức của một object cụ thể.
Các ví dụ được thể hiện từ trước đến giờ là số cho sự đơn giản, nhưng reduce() và reduceRight() không có ý định
chỉ cho tính toán toán học. Bất cứ hàm nào cái có thể kết hợp 2 giá trị (như 2 objects) thành một giá trị cùng dạng
có thể được sử dụng như một hàm reduction. Mặt khác, các thuật toán thể hiện sử dụng các giảm mảng có thể nhanh
chóng trở nên phức tạp và khó để hiểu, và bạn có thể thấy rằng nó là dễ dàng hơn để đọc, viết và lí giải về code
của bạn nếu bạn sử dụng các looping constructs thông thường để xử lí các mảng của bạn.
