Từ giảm theo nghĩa đen là "làm cho một cái gì đó nhỏ hơn". Đó là một khái niệm lập trình chức năng áp dụng một hàm đối với bộ tích lũy và mỗi phần tử trong một mảng để giảm nó thành một giá trị duy nhất. Nó là một khái niệm rất mạnh mẽ và được sử dụng để phát triển các thư viện và framework phức tạp như Redux hoặc Ramda .
Trong JavaScript , reduce có sẵn dưới dạng một phương thức mảng. Tôi đã sử dụng phương pháp rút gọn trong công việc của mình trong một thời gian dài. Tuy nhiên, tôi nhận thấy rằng nhiều bạn bè và đồng nghiệp của tôi gặp khó khăn trong việc hiểu và sử dụng phương pháp này một cách hiệu quả. Do đó, tôi quyết định viết bài này để giải thích phương pháp rút gọn một cách đơn giản hơn. Khái niệm mạnh mẽ này có thể giúp tối ưu hóa mã và triển khai các hệ thống và logic phức tạp. Hy vọng, điều này sẽ giúp nhiều người hiểu đúng về nó.
reduceBây giờ chúng ta hãy quên phương thức Array đi . Chúng tôi sẽ tạo chức năng của riêng mình reducetừ đầu để hiểu rõ hơn về những gì nó thực sự làm.
Để bắt đầu, hãy chia nhỏ các thành phần khác nhau trong hàm rút gọn .
Tôi sẽ sử dụng TypeScript để xây dựng chức năng trong bài viết này. Điều này sẽ cho phép tôi sử dụng các loại tĩnh để xác định chức năng tốt hơn và giúp người đọc hiểu rõ hơn.
type Reducer<TEle, TAcc> = (acc: TAcc, ele: TEle) => TAcc;
function reduce<TEle, TAcc>(
arr: TEle[],
reducer: Reducer<TEle, TAcc>,
initialValue: TAcc
) {
// TODO: Implement
}
Hãy xem xét một ví dụ đơn giản về rút gọn — “Tổng các phần tử trong một mảng” . Nó sẽ khá dễ dàng để thực hiện logic cho việc này. Hãy làm nó:
const arr = [1,2,3,4,5,6,7,8,9,10];
let sum = 0;
for (let num of arr) {
sum = sum + num;
}
console.log(sum);
Bây giờ chúng ta có thể dễ dàng viết lại cùng một đoạn mã dưới dạng kết hợp các thành phần giảm khác nhau.
const arr = [1,2,3,4,5,6,7,8,9,10];
const initialValue = 0;
const reducer = (acc: number, ele: number) => acc + ele;
let acc = 0;
for (let ele of arr) {
acc = reducer(acc, ele);
}
Bây giờ, chúng ta có thể sử dụng thông tin trên để hoàn thành reducechức năng của mình.
type Reducer<TEle, TAcc> = (acc: TAcc, ele: TEle) => TAcc;
function reduce<TEle, TAcc>(
arr: TEle[],
reducer: Reducer<TEle, TAcc>,
initialValue: TAcc
) {
let acc = initialValue;
for (let ele of arr) {
acc = reducer(acc, ele);
}
return acc;
}
Tham số bộ giảm tốc trong phương thức rút gọn cũng lấy chỉ mục và mảng đầu vào làm đối số nhưng về bản chất, nó được triển khai giống như hàm rút gọn mà chúng ta vừa tạo.
Bây giờ, có một số điều mà bạn có thể làm nhiều hơn để thực sự giỏi trong việc sử dụng phép rút gọn là thực hành và thử triển khai các logic rút gọn phức tạp. Một số mặt hàng bạn có thể thử là:
valuevà trả về tổng của tất cả valuecác thuộc tính.valuevà trả về giá trị trung bình của tất cả valuecác thuộc tính.namethuộc tính và trả về một chuỗi nối tất cả namecác thuộc tính, được phân tách bằng dấu phẩy.
Khi bạn gửi yêu cầu tới facebook.com, máy tính của bạn sẽ tra cứu tên miền để dịch tên miền đó thành địa chỉ IP để máy tính của bạn có thể thực hiện kết nối đó.
Ngôn ngữ của chúng ta là một công cụ mạnh mẽ có thể định hình suy nghĩ, thái độ và hành động của chúng ta. Ngay cả những thuật ngữ dường như vô hại cũng có thể duy trì những định kiến và định kiến có hại.
Gần đây, tôi đã truy cập Linkedin, mạng xã hội chuyên nghiệp lớn nhất thế giới và tìm thấy các bài đăng của các nhà thiết kế tự do mà tôi theo dõi, những người đã thu hút sự chú ý của tôi. Tất cả họ đều đăng ảnh chụp từ máy bay, trên bãi biển với máy tính xách tay của họ, từ bể bơi và văn phòng với những khung cảnh tuyệt vời.
Hôm qua, chúng ta đã khép lại cuộc thi Ca khúc Eurovision năm nay bằng một đêm chung kết hoành tráng, hỗn loạn, nơi ca sĩ người Thụy Điển Loreen đã mang về chiếc cúp, trở thành người phụ nữ đầu tiên giành chiến thắng hai lần và mang vương miện về cho Thụy Điển 50 năm sau khi ABBA giành chiến thắng trong cuộc thi với “Waterloo”. Họ tiếp tục trở thành một trong những nghệ sĩ lớn nhất trong thể loại nhạc pop.
Khi bạn gửi yêu cầu tới facebook.com, máy tính của bạn sẽ tra cứu tên miền để dịch tên miền đó thành địa chỉ IP để máy tính của bạn có thể thực hiện kết nối đó.
Tay tôi ngứa ngáy lan rộng khi tôi mặc cả với người bán sách địa phương để mua một cuốn sách khác. Cuốn sách này giống như những cuốn còn lại mà tôi đã mua gần đây sẽ lên ngôi trong đống 'Cần đọc' (TBR) của tôi; tuy nhiên, tôi đã mua nó.