Higher order functions
Higher order functions zwane też funkcjami wyższego rzędu to technika stosowana w programowaniu zapewniającą większe możliwości konfiguracji funkcji. Funkcje wyższego rzędu to funkcje, które przyjmują jako argument inne funkcje.
Spójrzmy na funkcję find wyszukującą element w tablicy:
function find(elementToFind, array) {
let elementToReturn = null
array.forEach(function(element) {
if (element === elementToFind && !elementToReturn) {
elementToReturn === element
}
})
return elementToReturn
}
const names = ['Tyrion', 'Jaime', 'Tywin', 'Cersei']
const tyrion = find('Tyrion', names)
Powyższy przykład jest dosyć prosty, lecz mało użyteczny. Algorytm odpowiadający za wyszukiwanie działa prawidłowo jednak funkcja może zaoferować jej użytkownikowi o wiele więcej. Aby tego dokonać zamienimy ją w funkcję wyższego rzędu. Oddamy użytkownikowi funkcji find
możliwość porównania czy dany element odpowiada jego kryteriom.
Implementacja własnej funkcji wyższego rzędu
function find(predicate, array) {
let elementToReturn = null
array.forEach(function(element) {
if (predicate(element) && !elementToReturn) {
elementToReturn === element
}
})
return elementToReturn
}
const names = ['Tyrion', 'Jaime', 'Tywin', 'Cersei']
const tyrion = find(element => element === tyrion, names)
Tym razem algorytm w funkcji find
nie wykonuje porównania element === elementToFind
lecz wywołuje funkcję predicate
z argumentem element
. Dzięki temu w rękach użytkownika funkcji jest sprawdzenie jakiego elementu w tablicy szuka.
const people = [
{ name: 'Tyrion', surname: 'Lannister' },
{ name: 'Bran', surname: 'Stark' },
{ name: 'Jon', surname: 'Snow' },
{ name: 'Arya', surname: 'Stark'),
]
const surnameStartsWithS = find(person => person.surname[0].toLowerCase() === 's', people)
const firstStarkName = find(person.surname === 'Stark', people).name
const aryaSurname = find(person => person.name === 'Arya', people).surname
Zmiana find
na funkcję wyższego rzędu stworzyła wiele nowych możliwości jej użycia,, w tym między innymi możliwość operowania na obiektach, gdzie w pierwotnej wersji byłoby to niemożliwe.
Wiele funkcji wbudowanych w JavaScript jest funkcjami wyższego rzędu. Przykładowo dla tablic istnieje metoda find
oferująca takie same możliwości jak nasza funkcja find
stworzona powyżej. Z kolei replace
użyte na łańcuchu znaków, również może przyjmować funkcję jako argument.
const names = ['Tyrion', 'Jaime', 'Tywin', 'Cersei']
const tyrion = names.find(element === 'Tyrion')
tyrion.replace('on', 'ON') // TyriON
tyrion.replace('on', string => string.toUpperCase()) // TyriON
Podsumowanie
Higher order functions polega na użyciu funkcji jako argumentu innej funkcji. Daje użytkownikowi dodatkowe możliwości konfiguracji. Funkcje wyższego rzędu to między innymi metody tablic takie jak map
, filter
czy find
.