Ứng dụng của Currying Function

927

Bài viết được sự cho phép của tác giả Lưu Bình An

Currying function là một kỹ thuật viết function, thay vì nhận nhiều tham số cùng lúc, thành nhiều function nhỏ, trên từng function nhỏ cho ta truyền vào tuần tự các tham số

Có thể đọc lại bài này của mình

const add = (a, b) => a + b
console.log(add(1,2))

// viết thành currying
const add = a => b => a + b
console.log(add(1)(2))

Câu hỏi là tại sao mình lại viết như thế này ta?

Ví dụ chúng ta có một mảng

const list = [
  { id: 1, name: 'Steve', email: 'steve@example.com' },
  { id: 3, name: 'Pamela', email: 'pam@example.com' },
  { id: 4, name: 'Liz', email: 'liz@example.com' }
]

Chúng ta muốn xóa phần tử có name=John

const noJohn = list.filter(item => item.name !== 'John')

Tưởng tượng chúng ta có function filter kiểu như vậy ở nhiều nơi trong code, để đảm bảo DRY, chúng ta sẽ viết riêng một function

  Ứng dụng của Currying Function
  1001 Tips: Con trỏ và hàm (Pointer & Function) trong C++

Xem thêm nhiều việc làm Javascript mới trên TopDev

const filtering = item => item.name !== name

const filterByName = (list, name) => list.filter(filtering)

Tuy nhiên lỗi nè, const filtering = item => item.name !== name làm sao biết được name? Currying đến giải cứu đây

// curring
const filtering = (name) => (item) => item.name !== name

const filterByName = (list, name) =>
	list.filter(filtering(name))

Chuyện gì đã xảy ra? Có thể viết lại tường minh hơn để chúng ta dễ hình dung, không dùng arrow function

function filterByName(list, name) {
    return list.filter(function(nameToFilter) {
        return function(item) {
            return item.name !== nameToFilter
        }
    // truyền `name` giống như thời jQuery
    }(name))
}

Phiên bản Currying đỉnh của chóp

const filter = predicate => array => array.filter(predicate)
const filterBy = propertyName => propertyValue => filter(item[propertyName] => propertyValue)

// sử dụng
const filterByName = filterBy('name')
const filterByNameJohn = filterByName("John")

console.log(filterByNameJohn(list))

A practical example of how to use Currying in Javascript

Bài viết gốc được đăng tải tại vuilaptrinh.com

Có thể bạn quan tâm:

Xem thêm Việc làm CNTT hấp dẫn trên TopDev