Higher Order Functions in JavaScript - Lee-hyuna/33-js-concepts-kr GitHub Wiki
κ³ μ°¨ ν¨μλ μ²μμ κ²λμ§λ§ λ°°μ°λ 건 μ΄λ ΅μ§ μλ€. κ³ μ°¨ ν¨μλ λ¨μν ν¨μλ₯Ό λ§€κ° λ³μλ‘ λ°κ±°λ ν¨μλ₯Ό κ²°κ³Όλ‘ λ°ννλ ν¨μμ΄λ€. JavaScriptμμ κ°μ₯ μ μ©ν ν¨ν΄ μ€ νλμ΄λ©° ν¨μν νλ‘κ·Έλλ° μμ νΉν μ€μνλ€.
λ¨Όμ μλ°μ€ν¬λ¦½νΈμ νΈλ¦¬ν Array.map()
λ©μλλ₯Ό μ΄μ©ν μμ λΆν° νκ² λ€. κ°κ° name μμ±μ κ°μ§ κ°μ²΄ λ°°μ΄μ΄ μλ€κ³ κ°μ ν΄ λ³΄μ:
const characters = [
{name: 'Han Solo'},
{name: 'Luke SkyWalker'},
{name: 'Leia Organa'}
];
map
λ©μλλ₯Ό μ΄μ©νμ¬ κ° nameλ€μ μ½μμ μ°μ΄ 보μ. (μ€μ μμ ).
// ES6 syntax
const names = characters.map(character => character.name);
console.log(names); // "Han Solo" "Luke SkyWalker" "Leia Organa"
// ES5 syntax
var names2 = characters.map(function(character) { return character.name; }); console.log(names2); // "Han Solo" "Luke SkyWalker" "Leia Organa"
map
λ©μλ (μΌλͺ
ν¨μ)κ° λ€λ₯Έ ν¨μλ₯Ό λ§€κ° λ³μλ‘ λ°μ μ¬μ©νλ κ²μ 보μλκ° ? map λ©μλλ κ³ μ°¨ ν¨μμ λν μ μμ μλ§μ μμ΄λ€. κ³ μ°¨ ν¨μλ κ·Έλ κ² μ΄λ €μ΄ κ²μ΄ μλλ€. μ€μ λ‘, μ°λ¦¬λ map λ©μλκ° κ³ μ°¨ ν¨μλΌλ κ²μ κΉ¨λ«μ§ λͺ»νκ³ νμ μ¬μ©νμ μλ μλ€.
μ΄μ ν¨μν νλ‘κ·Έλλ°μμ λ°μ νκ² κ΄λ ¨λ λ€λ₯Έ κ°λ μ μ΄ν΄λ³΄μ. ν¨μ ꡬμ±(Function composition) μ κ³ μ°¨ ν¨μλΌλ κ°λ μ μ·¨νκ³ λ§€μ° κ°λ ₯ν λ°©μμΌλ‘ μμ±ν μ μλ€. μκ³ μ§μ€λ ν¨μλ€μ μ‘°ν©νμ¬ λ³΅μ‘ν κΈ°λ₯μ λ§λ€ μ μλ€. μ΄λ¬ν "λΉλ© λΈλ‘"κΈ°λ₯μ μκ² μ μ§νλ©΄ ν μ€νΈνκΈ°κ° μ½κ³ λΉμ©μ μ κ² λ€κ² νλ©°, μ¬μ¬μ© ν μ μλ€.
μ΄κ²μ΄ μ΄λ»κ² 보μ΄λμ§ λ³΄λ €λ©΄ λ€λ₯Έ μλ₯Ό μ΄ν΄ 보μ. μ²μμ μ½λκ° μ½κ° νΌλμ€λ¬μλ κ±±μ νμ§λ§λΌ. μ μ νμ μ½λλ₯Ό μ²μ²ν μ΄ν΄λ³Ό κ²μ΄λ€. λ¨Όμ ES6 λ²μ λΆν° μμν΄ λ³΄μ.
// ES6 version
const characters = [
{name: 'Luke Skywalker', img: 'http://example.com/img/luke.jpg', species: 'human'},
{name: 'Han Solo', img: 'http://example.com/img/han.jpg', species: 'human'},
{name: 'Leia Organa', img: 'http://example.com/img/leia.jpg', species: 'human'},
{name: 'Chewbacca', img: 'http://example.com/img/chewie.jpg', species: 'wookie'}
];
const humans = data => data.filter(character => character.species === 'human');
const images = data => data.map(character => character.img);
const compose = (func1, func2) => data => func2(func1(data));
const displayCharacterImages = compose(humans, images);
console.log(displayCharacterImages(characters));
/*
Logs out the following array
["http://example.com/img/luke.jpg",
"http://example.com/img/han.jpg",
"http://example.com/img/leia.jpg"
]
*/
κ·Έλ¦¬κ³ μ΄μ κ°μ μ½λ μ ES5 λ²μ μ 보μ.
// ES5 version
var characters = [
{name: 'Luke Skywalker', img: 'http://example.com/img/luke.jpg', species: 'human'},
{name: 'Han Solo', img: 'http://example.com/img/han.jpg', species: 'human'},
{name: 'Leia Organa', img: 'http://example.com/img/leia.jpg', species: 'human'},
{name: 'Chewbacca', img: 'http://example.com/img/chewie.jpg', species: 'wookie'}
];
var humans = function(data) {
return data.filter(function(character) {
return character.species === 'human';
})
}
var images = function(data) {
return data.map(function(character) {
return character.img;
})
}
function compose(func1, func2) {
return function(data) {
return func2(func1(data));
};
}
var displayCharacterImages = compose(humans, images);
console.log(displayCharacterImages(characters));
/*
Logs out the following array
["http://example.com/img/luke.jpg",
"http://example.com/img/han.jpg",
"http://example.com/img/leia.jpg"
]
*/
μ, μ΄κ²μ λ¨κ³λ³λ‘ μ΄ν΄λ³΄λ©° μ΄λ»κ² μ μ©ν μ§ μμ보μ. μ€λͺ μ κ°λ₯ν μΉμν ES5 μμ λ₯Ό μ¬μ©ν κ²μ΄λ€.
-
λ λ²μ§Έ μ€μμ κ°μ²΄ λ°°μ΄μ μ μΈνλ€.(
characters
). API νΈμΆμ κ²°κ³Όλ‘μ¨ μ΄λ¬ν λ°μ΄ν°λ₯Ό μμ νκ³ μμ νλ κ²μ μΌλ° μ μ΄λ€. -
κ·Έλ° λ€μ μ°λ¦¬κ° νΈμΆν 첫 λ²μ§Έ ν¨μ(
humans
)λ₯Ό μ μΈνλ€.μ΄ ν¨μμ λν΄ μμμΌν κ²μ μμ ν¨μλΌλ κ² μ΄λ€. μ¦, λμΌν μ λ ₯μ΄ μ£Όμ΄μ§λ©΄ νμ λμΌν μΆλ ₯μ λ°ννλ€. ν¨μν νλ‘κ·Έλλ°μ ν΅μ¬ κ°λ μ΄λ€. μ΄λ₯Ό ν΅ν΄ ν¨μλ₯Ό μ½κ² ν μ€νΈ, 리ν©ν λ§ ν μ μλ€. -
κ·Έλ° λ€μ λ λ²μ§Έ ν¨μ(
images
)λ₯Ό μ μΈνλ€. .map
ν¨μ μμ μ λ¬ λ μ½λ°± ν¨μλ₯Ό μ΄ν΄λ΄λΌ. μλμμ μ€λͺ ν κ²μ΄λ€.
function(character) {
return character.img;
}
μ½λλ₯Ό λ μ½κ² λ°λΌν μ μλλ‘ "character"λ₯Ό μ¬μ©νμΌλ λμ "item"λλ μ΄μ μ μ¬ν κ² μ΄λ¦μΌλ‘ μ¬μ©νλ©΄ ν¨μκ° μ½λμ λλ¨Έμ§ λΆλΆμΌλ‘ λΆν° μμ ν λΆλ¦¬λμλμ§ νμΈν μ μλ€. img
μμ± μ΄μλ λͺ¨λ κ°μ²΄ λ°°μ΄μ μ¬μ©ν μ μλ€. μ½λ μ¬μ¬μ©μ ν μ μλ€λ κ²μ΄λ€!
-
λ€μμΌλ‘ λ ν¨μλ₯Ό λ§€κ° λ³μλ‘ λ°κ³ λ€λ₯Έ ν¨μλ₯Ό λ°ννλ κ³ μ°¨ ν¨μμΈ
compose
κ° μλ€. μ΄ ν¨μλ λν μΌμͺ½μμ μ€λ₯Έμͺ½μΌλ‘ νΈμΆ λ λ ν¨μμ κ²°κ³Όλ₯Ό κ²°ν©νκΈ° μν΄ μ¬μ¬μ© λ μ μλ€. λ°μ΄ν°λ₯Ό μ λ¬νκ³ ν¨μκ° νμν λ°©μμΌλ‘ λ³ννλ©΄ λλ€. -
μ°λ¦¬λ λ€μ
compose
ν¨μμhumans
κ³Όimages
ν¨μλ₯Ό μ λ¬νμ¬ νΈμΆ ν κ²μ΄κ³ , λ³μdisplayCharacterImages
μ κ²°κ³Όλ₯Ό ν λΉν κ²μ΄λ€ . μ§κΈdisplayCharacterImages
μ κ°μ λ‘κΉ νλ©΄,compose
μ μν΄ λ°νλ λ΄λΆ ν¨μλ₯Ό λ³Ό μ μλ€.
function (data) {
return func2(func1(data));
}
- λ§μΉ¨λ΄
displayCharacterImages
λ₯Ό νΈμΆνλ©΄ μ λ¬λcharacters
λ°°μ΄μfunc1
(humans
)μ μ λ¬ λ κ²μ΄λ€. μ΄ ν¨μμ λ°°μ΄μ κ²°κ³Ό κ°μ μ€μ§ "human" λ¬Έμλ₯Ό ν¬ν¨ν κ²λ€ λ§ λ°ννλ€.(μΈμ΄ λ―Έμ!) κ·Έλ¦¬κ³ μ΄ κ²°κ³Ό κ°μ΄ λ°μ΄ν° μΈνΈμμ human μΊλ¦ν°μ μ΄λ―Έμ§ μμ±μ λ°ννλfunc2
(images
)ν¨μλ‘ μ λ¬λλ€. μ΄ ν¨μλ₯Ό μ΄μ©ν΄μ ν¬ μ¬μ΄νΈμ μΌλΆμ ν΄λΉ μ΄λ―Έμ§λ₯Ό νμ ν΄λ³΄λ κ²μ μμν΄ λ΄λΌ.
λ€νμ€λ½κ²λ κ³ μ°¨ ν¨μμ λν μ£Όμ λ₯Ό μκ°νκ³ μμ ν¨μλ₯Ό κ²°ν©νμ¬ λ³΅μ‘ν λμμ λ§λλ λ°©λ²μ λν΄ νλ€. μ΄κ²μ μ¦μ μ΄ν΄νμ§ λͺ»ν΄λ κ±±μ νμ§ λ§μλΌ. μ΄κ²μ ν¨μν νλ‘κ·Έλλ°μ μΌλΆμ΄μ§λ§, μΌλ¨ μ¬μ©ν μ μκ² λλ€λ©΄ λ§€μ° κ°λ ₯νκ³ μ€λ₯κ° μ μ μ μ°ν μ½λλ₯Ό μμ±ν μ μλ€.
ν¨μν νλ‘κ·Έλλ°μ λν΄ λ λ°°μ°κ³ μΆλ€λ©΄ λͺ κ°μ§ μ’μ μλ£κ° μλ€. 첫 λ²μ§Έλ Anjana Vakilμ 컨νΌλ°μ€ λ°ν μΈ Learning Functional Programming with JavaScriptμ΄λ€. Mattias Petter Johansson (mpj)μ νλ₯νκ³ μ¬λ―Έμλ λΉλμ€ νν λ¦¬μΌ μ리μ¦λ μλ€. λ§μ§λ§μΌλ‘ κΈ°μ¬ νμμ μ νΈνλ μ¬λλ€μκ²λ Raja Raoμ Functional Programming In JavaScript β With Practical Examplesκ³Ό Peleke Sengstackμ How to Use Map, Filter, & Reduce in JavaScriptμ΄ μλ€.