Nguồn
Cả hai map
và reduce
có đầu vào là mảng và một hàm bạn xác định. Chúng bổ sung theo một cách nào đó: map
không thể trả về một phần tử duy nhất cho một mảng nhiều phần tử, trong khi reduce
sẽ luôn trả về bộ tích lũy mà bạn đã thay đổi cuối cùng.
map
Bằng cách sử dụng, map
bạn lặp lại các phần tử và đối với mỗi phần tử, bạn trả về một phần tử bạn muốn.
Ví dụ: nếu bạn có một mảng số và muốn lấy các ô vuông của chúng, bạn có thể làm như sau:
const square = x => x * x
console.log([1, 2, 3, 4, 5].map(square))
reduce
Sử dụng một mảng làm đầu vào, bạn có thể nhận một phần tử duy nhất (giả sử một Đối tượng, một Số hoặc một Mảng khác) dựa trên hàm gọi lại (đối số đầu tiên) nhận accumulator
và current_element
tham số:
const numbers = [1, 2, 3, 4, 5]
console.log(numbers.reduce(function (acc, current) {
return acc + current
}, 0))
console.log(numbers.reduce(function (acc, current) {
return acc * current
}, 1))
Bạn nên chọn cái nào khi bạn có thể làm điều tương tự với cả hai? Hãy thử tưởng tượng mã trông như thế nào. Đối với ví dụ được cung cấp, bạn có thể tính toán mảng hình vuông như bạn đã đề cập, bằng cách sử dụng reduce
:
[1, 2, 3, 4, 5].reduce(function (acc, current) {
acc.push(current*current);
return acc;
}, [])
[1, 2, 3, 4, 5].map(x => x * x)
Bây giờ, nhìn vào những thứ này, rõ ràng là lần triển khai thứ hai trông đẹp hơn và nó ngắn hơn. Thông thường bạn sẽ chọn giải pháp sạch hơn, trong trường hợp này là như vậy map
. Tất nhiên, bạn có thể làm điều đó reduce
, nhưng tóm lại, hãy nghĩ rằng cái nào sẽ ngắn hơn và cuối cùng sẽ tốt hơn.