Higher-Order Functions trong javascript

Higher-Order Functions trong javascript

Higher Order Function là gì?

Nếu bạn đang làm việc với JavaScript, chắc hẳn bạn đã bắt gặp thuật ngữ Higher-order functions. Mặc dù nghe có vẻ phức tạp nhưng thực tế không phải vậy.
Điều làm cho JavaScript phù hợp với lập trình chức năng là nó chấp nhận các Higher-order functions.

Higher-order functions là các hàm hoạt động trên các hàm khác, bằng cách lấy chúng làm đối số hoặc trả về chúng. Nói một cách dễ hiểu, Higher-order functions là một hàm nhận một hàm làm đối số hoặc trả về hàm dưới dạng đầu ra. Chúng ta sẽ đi vào ví dụ cụ thể để xem Higher-Order Functions hoạt động như thế nào nhé?

Ví dụ

Chúng ta có danh sách nhân viên như sau:
var staffs = [ {name: 'Mike', age: 20, sex: 'M'}, {name: 'Brian', age: 23, sex: 'F'}, {name: 'Bob', age: 19, sex: 'M'}, {name: 'Jack', age: 22, sex: 'M'}, {name: 'Ethan', age: 25, sex: 'M'}, {name: 'Paula', age: 20, sex: 'F'}, {name: 'Donald', age: 21, sex: 'M'}, {name: 'Jennifer', age: 18, sex: 'F'}, {name: 'Courtney', age: 28, sex: 'F'}, {name: 'Bob', age: 29, sex: 'F'} ]

Yêu cầu bài toán:
  • Tính độ tuổi trung bình của nhân viên toàn công ty.
  • Tính độ tuổi trung bình của nhân viên nam.
  • Tìm độ tuổi nhỏ nhất của nhân viên.

Cách làm thứ nhất:

Độ tuổi trung bình của nhân viên toàn công ty:

let averageAge = staffs.reduce(function (acc, curr) { return acc + curr.age; }, 0) / staffs.length;
console.log('Độ tuổi trung bình: ', averageAge); // 22.5

Độ tuổi trung bình của nhân viên nam:

let findMale = staffs.filter( function(staff){ return staff.sex === 'M'; })

let averageMale = findMale.reduce(function (acc, curr) { return acc + curr.age; }, 0) / findMale.length; console.log('Tìm độ tuổi trung bình nhân viên nam:', averageMale);// 21.4

Tìm độ tuổi nhỏ nhất của nhân viên:

let ageMin = Math.min.apply(Math,staffs.map(function(e){return e.age})); console.log('Độ tuổi nhỏ nhất', ageMin); //18

Cách làm thứ 2: sử dụng Higher-Order Functions

let isMale = (staff) => staff.sex === "M";

let getMale = (staffs) => staffs.filter(isMale);

let minAge = (staffs) => Math.min(...staffs.map((staff) => staff.age));

let average = (staffs) => staffs.reduce((acc, curr) => acc + curr.age, 0) / staffs.length;

// Tìm độ tuổi trung bình

let staffAverage = average(staffs);

console.log("staffAverage", staffAverage); //22.5

// Độ tuổi trung bình của nhân viên nam:

let maleAverage = average(getMale(staffs));

console.log("maleAverage", maleAverage); //21.4

// Tìm độ tuổi nhỏ nhất của nhân viên:

let lowestAge = minAge(staffs);

console.log("lowestAge", lowestAge); //18

Thông qua hai ví dụ trên chúng ta có thể thấy được sự khác biệt giữa việc sử dụng và không sử dụng higher-order functions. Đến đây hẳn các bạn đã hình dung được higher-order functions là gì chưa?

Tại sao nên sử dụng higher-order functions

Một trong những lợi thế lớn của việc sử dụng Higher-order functions khi chúng ta có thể là thành phần. Chúng ta có thể tạo các hàm nhỏ hơn chỉ chăm sóc một đoạn logic. Sau đó, chúng tôi soạn thảo các hàm phức tạp hơn bằng cách sử dụng các hàm nhỏ hơn khác nhau.

Kỹ thuật này làm giảm lỗi và làm cho mã của chúng tôi dễ đọc và dễ hiểu hơn. Bằng cách học cách sử dụng các Higher-order functions, bạn có thể bắt đầu viết mã tốt hơn các developer khác. Hy vọng rằng qua bài viết này bạn có thể áp dụng nó thành công trong các dự án của mình.

Tài liệu tham khảo

Understanding Higher-Order Functions in JavaScript

Higher-order functions in Javascript