Higher Order Functions in JavaScript_1 - Lee-hyuna/33-js-concepts-kr GitHub Wiki

Higher Order Functions in JavaScript

λ²ˆμ—­ : http://www.zsoltnagy.eu/higher-order-functions-in-javascript/

이 κΈ°μ‚¬μ—μ„œλŠ” κ³ μ°¨ ν•¨μˆ˜μ— λŒ€ν•΄ ν•™μŠ΅ν•©λ‹ˆλ‹€. ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ˜ μ€‘μš”ν•œ μ΄ˆμ„μ€ κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€. λŒ€λΆ€λΆ„ functional μŠ€νƒ€μΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λ €λ©΄ κ³ μ°¨ ν•¨μˆ˜μ˜ κΈ°λ³Έ 사항을 μˆ™μ§€ν•΄μ•Όν•©λ‹ˆλ‹€.

λ¨Όμ €, κ³ μ°¨ ν•¨μˆ˜μ˜ κ°„λ‹¨ν•œ μ •μ˜λ₯Ό λ°°μ›λ‹ˆλ‹€. 이미 μ‚¬μš©μ€‘μΈ κ³ κΈ‰ ν•¨μˆ˜λ₯Ό λ³΄μ—¬μ€ŒμœΌλ‘œμ¨ μ •μ˜λ₯Ό κΈ°μ–΅ν•  κ²ƒμž…λ‹ˆλ‹€. κ³ μ°¨ ν•¨μˆ˜ 예제λ₯Ό κ΅¬ν˜„ν•˜μ—¬ 이 글을 λ§ˆμΉ˜κ² μŠ΅λ‹ˆλ‹€.

What are higher order functions?

κ³ μ°¨ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 인수λ₯Ό λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

λ˜λŠ” 이 μ •μ˜μ—μ„œ λͺ¨μˆœλœ μ˜λ―Έκ°€ μ•„λ‹™λ‹ˆλ‹€.

이전 μ„Ήμ…˜μ—μ„œ JavaScript ν•¨μˆ˜λŠ” κ°’μ΄λΌλŠ” 것을 λ°°μ› μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ ν•¨μˆ˜λŠ” λ‹€λ₯Έ ν•¨μˆ˜λ‘œ 전달 될 수 있으며 ν•¨μˆ˜μ˜ λ°˜ν™˜ 값일 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

이것은 κ³ μ°¨ ν•¨μˆ˜λ₯Ό μ΄ν•΄ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  μ΄λ‘ μž…λ‹ˆλ‹€. κ³ μ°¨ ν•¨μˆ˜λΌλŠ” 이름은 μ²˜μŒμ—λŠ” λ¬΄μ„œμ›Œ λ³΄μ΄μ§€λ§Œ μ‹€μ œλ‘œλŠ” 아무것도 두렡지 μ•ŠμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ₯Ό 인수둜 μ „λ‹¬ν•˜κ±°λ‚˜ λ°˜ν™˜ κ°’μœΌλ‘œ λ°˜ν™˜ν•˜λ©΄λ©λ‹ˆλ‹€.

특히 JavaScript λ―Έλ‹ˆ μ½”μŠ€λ₯Ό κ²ͺ은 경우 이미 λ§Žμ€ κ³ μ°¨ ν•¨μˆ˜λ₯Ό μ•Œκ³ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.

setTimeout( () => console.log('done'), 1000 );

κ³ μ°¨ ν•¨μˆ˜μ˜ 쒋은 μ˜ˆλŠ” setTimeout μž…λ‹ˆλ‹€. setTimeout의 첫 번째 μΈμˆ˜λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ setTimeout 은 κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.

document.querySelector( '.js-submit' )
   .addEventListener( 'click', submitCallback );

DOM λ…Έλ“œμ— 이벀트λ₯Ό μΆ”κ°€ ν•  λ•Œ 이벀트λ₯Ό λ“±λ‘ν•˜λŠ” ν•¨μˆ˜λŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.

setTimeout κ³Ό addEventListener λŠ” λͺ¨λ‘ ν•¨μˆ˜ 인자λ₯Ό 가지고 있기 λ•Œλ¬Έμ— κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€. 이제 ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” 예제λ₯Ό 보자.

μ»¨ν…μŠ€νŠΈ 바인딩은 바인딩 된 this κ°’μ΄μžˆλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€. λ”°λΌμ„œ bind λŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.

const area = function() {
	return this.width * this.height;
};

const boundArea = area.bind({ width: 2, height: 3 });

boundArea();

기술적으둜 bind λŠ” ν”„λ‘œν†  νƒ€μž… 체인 상속을 ν†΅ν•œ 'μ˜μ—­'객체의 λ°©λ²•μž…λ‹ˆλ‹€. bind λŠ” λ…λ¦½ν˜• ν•¨μˆ˜μ΄κ³  areaλŠ” 인수 인 ν˜•μ‹μœΌλ‘œ λ©”μ†Œλ“œ ν˜ΈμΆœμ„ 항상 λ‹€μ‹œ μž‘μ„±ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

const bind = function( f, ...args ) {
    return f.bind( ...args );
}

const boundArea = bind( area, { width: 2, height: 3 } );

λ‹€μ‹œ μž‘μ„±ν•œ ν›„μ—λŠ” bind κ°€ ν•¨μˆ˜ 인수λ₯Ό ν—ˆμš© ν• λΏλ§Œ μ•„λ‹ˆλΌ ν•¨μˆ˜λ„ λ°˜ν™˜ν•œλ‹€λŠ” 것을 λΆ„λͺ…νžˆ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€.

Writing higher order functions

μ‚¬μš©λ²•μ„ 보여주기 μœ„ν•΄ κ³ μ°¨ ν•¨μˆ˜λ₯Ό 직접 μž‘μ„±ν•˜κ³  싢을 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

centsλ₯Ό λ‚˜νƒ€λ‚΄λŠ” μ •μˆ˜ 값을 ν™”νλ‘œ ν˜•μ‹ν™”ν•˜λŠ” μž‘μ—…μ΄ μžˆλ‹€κ³  κ°€μ •ν•˜μ‹­μ‹œμ˜€. μš”μ²­μ—λŠ” 톡화 기호 지정 및 μ†Œμˆ˜ ꡬ뢄 κΈ°ν˜Έμ™€ 같은 일뢀 μ‚¬μš©μž μ •μ˜κ°€ ν¬ν•¨λ©λ‹ˆλ‹€.

ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄ λ°˜ν™˜ 값이 μ΅μˆ™ν•˜μ§€ μ•Šμ€ 경우 λ¬Έμžμ—΄ 및 ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄μ— λŒ€ν•œ λ‚΄ 기사strings and template literals.λ₯Ό μ½μœΌμ‹­μ‹œμ˜€.

const formatCurrency = function( 
    currencySymbol,
    decimalSeparator  ) {
    return function( value ) {
        const wholePart = Math.trunc( value / 100 );
        let fractionalPart = value % 100;
        if ( fractionalPart < 10 ) {
            fractionalPart = '0' + fractionalPart;
        }
        return `${currencySymbol}${wholePart}${decimalSeparator}${fractionalPart}`;
    }
}

> getLabel = formatCurrency( '$', '.' );

> getLabel( 1999 )
"$19.99"

> getLabel( 2499 )
"$24.99"

formatCurrency λŠ” κ³ μ • 톡화 κΈ°ν˜Έμ™€ μ†Œμˆ˜μ  ꡬ뢄 κΈ°ν˜Έκ°€ μžˆλŠ” ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

포맷터에 값을 μ „λ‹¬ν•œ λ‹€μŒ 전체 λΆ€λΆ„κ³Ό μ†Œμˆ˜ 뢀뢄을 μΆ”μΆœν•˜μ—¬ 이 κ°’μ˜ ν˜•μ‹μ„ μ§€μ •ν•©λ‹ˆλ‹€. ES6 μˆ˜ν•™ ν™•μž₯ trunc 을 μ‚¬μš©ν•˜μ—¬ κ²°κ³Όλ₯Ό μžλ¦…λ‹ˆλ‹€.

이 ν•¨μˆ˜μ˜ λ°˜ν™˜ 값은 톡화 기호, 전체 λΆ€λΆ„, μ†Œμˆ˜ ꡬ뢄 기호 및 μ†Œμˆ˜ 뢀뢄을 μ—°κ²°ν•˜λŠ” ν…œν”Œλ¦Ώ λ¦¬ν„°λŸ΄λ‘œ κ΅¬μ„±λ©λ‹ˆλ‹€.

톡화 κΈ°ν˜Έμ™€ μ†Œμˆ˜ ꡬ뢄 κΈ°ν˜ΈλŠ” λ°˜ν™˜ 된 ν•¨μˆ˜μ— μ „λ‹¬λ˜μ§€ μ•ŠμœΌλ©° κ³ μ • 된 κ°’μž…λ‹ˆλ‹€.

μš°λ¦¬λŠ” μ •μˆ˜ 값을 getLabel ν•¨μˆ˜μ— 전달할 수 있고 포맷 된 ν‘œν˜„μ„ λ‹€μ‹œ μ–»μŠ΅λ‹ˆλ‹€.

λ”°λΌμ„œformatCurrency κ³ μ°¨ ν•¨μˆ˜λŠ” μ‚¬μš© κ°€λŠ₯ν•œ 포맷터 ν•¨μˆ˜λ₯Ό 리턴 ν–ˆμŠ΅λ‹ˆλ‹€.

The undesirable forEach and map-reduce-filter

일뢀 κ³ μ°¨ ν•¨μˆ˜λŠ” JavaScriptμ—μ„œ 배열을 μ²˜λ¦¬ν•˜λŠ” 데 μœ μš©ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ λŒ€λΆ€λΆ„μ˜ κΈ°λŠ₯적 μŠ€νƒ€μΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ μ’…μ’… 루프 λŒ€μ‹  μ΄λŸ¬ν•œ ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κΈ°λŠ₯은 λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

  • map,
  • reduce,
  • filter.

λ‚΄κ°€ μ™œforEach 방법을 μ–ΈκΈ‰ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆκΉŒ? κ²°κ΅­, μš°λ¦¬λŠ” 루프에 λŒ€ν•΄ μ΄μ•ΌκΈ°ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

forEach 의 λ¬Έμ œμ μ€ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ—μ„œ μ™„μ „νžˆ μ“Έλͺ¨μ—†λŠ” ν•¨μˆ˜λΌλŠ” κ²ƒμž…λ‹ˆλ‹€. μˆœμˆ˜ν•˜κ²Œ κΈ°λŠ₯적인 μŠ€νƒ€μΌλ‘œ μ½”λ“œλ₯Ό μž‘μ„±ν•  λ•Œ forEach λ₯Ό μ‚¬μš©ν•˜λŠ” 것은 μ˜λ―Έκ°€ μ—†μŠ΅λ‹ˆλ‹€. κ°„λ‹¨ν•œ 예λ₯Ό λ΄…μ‹œλ‹€.

const values = [1, 2, 3, 3, 5];
let sum = 0;

values.forEach( v => { sum += v; } );

console.log( sum );

forEach ν—¬νΌλŠ” κ°’ 을 λ°˜λ³΅ν•˜κ³  λ°°μ—΄μ˜ 각 값에 λŒ€ν•œ 첫 번째 인수λ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€. 이 forEach 호좜의 μ£Όμš” νš¨κ³ΌλŠ” 'μ •μ˜λ˜μ§€ μ•ŠμŒ'이 λ°˜ν™˜λœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이 κ΄€μ μ—μ„œ ν•¨μˆ˜ 본문에 무엇이 μžˆλŠ”μ§€λŠ” μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ λ³Έλ¬Έ sum + = v λ₯Ό μ‹€ν–‰ν•˜λ©΄ side-effect κ°€ μƒμ„±λ˜μ–΄ forEach λ„μš°λ―Έμ˜ λ²”μœ„λ₯Ό λ²—μ–΄λ‚œ μ»¨ν…μŠ€νŠΈλ₯Ό μˆ˜μ •ν•©λ‹ˆλ‹€.

순수 κΈ°λŠ₯ ν”„λ‘œκ·Έλž˜λ°μ€ side-effect free μž…λ‹ˆλ‹€. λ°°μ—΄μ˜ forEach λ„μš°λ―ΈλŠ” μ‚¬μš© κ°€λŠ₯ν•œ 값을 λ°˜ν™˜ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ forEach λ₯Ό μ‚¬μš©ν•˜λŠ” μœ μΌν•œ μ΄μœ λŠ” forEach의 콜백 λ‚΄μ—μ„œ λΆ€μž‘μš©μ— μ˜μ‘΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

기술 μΈν„°λ·°μ—μ„œ, ν›„λ³΄μžλ“€μ΄ ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ„ μ‚¬μš©ν•˜κ² λ‹€κ³  μ„ μ–Έ ν•  λ•Œ μ’…μ’… λ‹Ήν™©μŠ€λŸ¬μ›Œ λ³΄μ΄λ―€λ‘œ for 루프 λŒ€μ‹ μ—forEach λ„μš°λ―Έλ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. 이 함정에 λ“€μ–΄ 가지 λ§ˆμ‹­μ‹œμ˜€.

배열을 μ‘°μž‘ν•˜λŠ” 더 λ‚˜μ€ κΈ°λŠ₯이 μžˆμŠ΅λ‹ˆλ‹€. reduce둜 같은 κ²°κ³Όλ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€ :

const values = [1, 2, 3, 3, 5];
const sum = values.reduce( (accumulator, v) => accumulator + v, 0 );
console.log( sum ); // 14

ReduceλŠ” ν•¨μˆ˜ μΈμˆ˜κ°€μžˆλŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€. 이 ν•¨μˆ˜ μΈμˆ˜λŠ” λ°°μ—΄μ˜ 각 μš”μ†Œμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€. λ°°μ—΄μ—μ„œ λˆ„μ‚°κΈ° λ³€μˆ˜μ™€ ν•˜λ‚˜μ˜ 값을 κ°€μ Έμ˜΅λ‹ˆλ‹€. 이 ν•¨μˆ˜ 인수의 λ°˜ν™˜ 값은 λˆ„μ‚°κΈ°μ˜ μƒˆλ‘œμš΄ κ°’μž…λ‹ˆλ‹€. 이 μƒˆλ‘œμš΄ 값은 λ‹€μŒ μš”μ†Œμ— μ†ν•˜λŠ” λ‹€μŒ ν˜ΈμΆœμ—μ„œ μ‚¬μš©λ©λ‹ˆλ‹€.

각 λ°˜λ³΅μ—μ„œ λˆ„μ‚°κΈ° λ³€μˆ˜μ˜ μƒνƒœμ™€ λ‹€μŒ λ°°μ—΄ 값을 μΈμ‡„ν•˜κ² μŠ΅λ‹ˆλ‹€.

const values = [1, 2, 3, 3, 5];
const sum = values.reduce( (accumulator, v) => {
    const result = accumulator + v;
    console.log( `accumulator, v, result: ${ accumulator }, ${ v }, ${ result }` );
    return result;
}, 0 );

λ‹€μŒ 값이 μ½˜μ†”μ— μΈμ‡„λ©λ‹ˆλ‹€.

accumulator,  v,  result:  0,  1,  1
accumulator,  v,  result:  1,  2,  3
accumulator,  v,  result:  3,  3,  6
accumulator,  v,  result:  6,  3,  9
accumulator,  v,  result:  9,  5,  14

그것이 당신이 κ°μ†Œμ— λŒ€ν•΄ μ•Œμ•„μ•Ό ν•  μ „λΆ€μž…λ‹ˆλ‹€. 곧 μš΄λ™μ„ ν•  수 있으며 μ‹€μ œλ‘œ μš΄λ™μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ ν•¨μˆ˜λŠ”mapμž…λ‹ˆλ‹€. Map은 λ°°μ—΄μ˜ 각 μš”μ†Œλ₯Ό κ°€μ Έ μ™€μ„œ 콜백 ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ λ³€ν™˜ν•˜κ³  λ³€ν™˜ 된 κ°’μ˜ 배열을 λ°˜ν™˜ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒ 식을 μ‚¬μš©ν•˜λ©΄ λ‹€λ₯Έ 2의 κ±°λ“­ μ œκ³±μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

> [0, 1, 2, 3, 4].map( v => 2 ** v );
[1, 2, 4, 8, 16]

** λŠ” ES2016 에 λ„μž… 된 μ§€μˆ˜ μ—°μ‚°μžμž…λ‹ˆλ‹€. 2 ** v λ₯Ό β€œ2의 κ±°λ“­ μ œκ³±β€μœΌλ‘œ μ½μŠ΅λ‹ˆλ‹€.

이제 2 의 처음 50의 νž˜μ„ λ§Œλ“€μ–΄ λ΄…μ‹œλ‹€. μ†μœΌλ‘œ 51 개의 μš”μ†Œλ‘œ κ΅¬μ„±λœ 배열을 λ§Œλ“€κ³  싢지 μ•Šλ‹€κ³  κ°€μ •ν•˜λ©΄ null μš”μ†Œλ‘œ 배열을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€.

new Array( 51 ).fill( null )

map ν•¨μˆ˜μ˜ μ½œλ°±μ€ λ°°μ—΄μ˜ ν˜„μž¬ μš”μ†Œμ˜ 인덱슀 인 두 번째 인수λ₯Ό ν—ˆμš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

> new Array( 51 ).fill( null ).map( (item, index) => index )
(51) [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]

ν•œ 단계 만 λ‚¨μ•˜μŠ΅λ‹ˆλ‹€. index λ₯Ό λ°˜ν™˜ν•˜λŠ” λŒ€μ‹  2 ** 인덱슀λ₯Ό λ°˜ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€.

> new Array( 51 ).fill( null ).map( (item, index) => 2 ** index )
(51) [1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648, 4294967296, 8589934592, 17179869184, 34359738368, 68719476736, 137438953472, 274877906944, 549755813888, 1099511627776, 2199023255552, 4398046511104, 8796093022208, 17592186044416, 35184372088832, 70368744177664, 140737488355328, 281474976710656, 562949953421312, 1125899906842624]

적어도 처음 20 개 값을 μ•Œκ³ μžˆλŠ” μ†Œν”„νŠΈμ›¨μ–΄ 개발자 μΉœκ΅¬κ°€ μžˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜λ„μ΄ 숫자λ₯Ό μ“°λŠ” 것보닀 λΉ λ₯΄κΈ° λ•Œλ¬Έμ—map을 μ‚¬μš©ν•˜μ—¬μ΄ 배열을 λ§Œλ“­λ‹ˆλ‹€.

μ„Έ 번째 고차원 λ°°μ—΄ ν•¨μˆ˜λŠ” 'ν•„ν„°'μž…λ‹ˆλ‹€. μš°λ¦¬λŠ” λ°°μ—΄μ—μ„œ 일뢀 μš”μ†Œλ₯Ό 버리고 λ‚˜λ¨Έμ§€ μš”μ†Œ 만 μœ μ§€ν•˜λŠ” 배열을 λ°˜ν™˜ν•˜λ €κ³  ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄ λ°°μ—΄μ—μ„œ λͺ¨λ“  음수 μš”μ†Œλ₯Ό 버리고 μ‹Άλ‹€κ³  κ°€μ • ν•΄λ³΄μ‹­μ‹œμ˜€.

> [-1, 5, 2, -4, -2, 2].filter( v => v >= 0);
[5, 2, 2]

array.filter (f)λŠ” κ·Έ μš”μ†Œλ“€μ„ ν•„ν„°λ‘œ μœ μ§€ν•˜μ—¬f (element)κ°€ 참된 값을 λ°˜ν™˜ν•©λ‹ˆλ‹€.

truthy 값이 무엇인지 λͺ¨λ₯΄λ©΄ this article λ‹€μŒμ„ ν™•μΈν•˜μ„Έμš”

Chaining map-reduce-filter

λ°˜ν™˜ 배열을 λ§€ν•‘ν•˜κ³  ν•„ν„°λ§ν•©λ‹ˆλ‹€.

μ–΄λ ˆμ΄μ—μ„œ 맡, μΆ•μ†Œ 및 ν•„ν„°κ°€ μž‘λ™ν•©λ‹ˆλ‹€.

λ”°λΌμ„œ 일련의 맡 및 ν•„ν„° ν˜ΈμΆœμ„ μ„œλ‘œ μ—°κ²°ν•  수 있으며 끝에 μ½œμ„ 쀄 μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ¬Έμžμ—΄ 배열이 있고a둜 μ‹œμž‘ν•˜λŠ” κ°€μž₯ κΈ΄ λ¬Έμžμ—΄μ˜ 길이λ₯Ό μ°ΎλŠ” 데 관심이 μžˆλ‹€κ³  κ°€μ •ν•˜μ‹­μ‹œμ˜€.

λ‹€μŒ 단계λ₯Ό μ‚¬μš©ν•˜μ—¬ μ†”λ£¨μ…˜μ„ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

  1. 'a'둜 μ‹œμž‘ν•˜μ§€ μ•ŠλŠ” μš”μ†Œλ₯Ό ν•„ν„°λ§ν•˜μ‹­μ‹œμ˜€.
  2. μš”μ†Œλ₯Ό 길이에 λ§΅ν•‘ν•˜μ‹­μ‹œμ˜€.
  3. 이 길이의 값듀을 μ΅œλŒ€κ°’μœΌλ‘œ ν•œμ •ν•΄λΌ.
const words = ['ab', 'abc', 'bcde'];

words
    .filter( w => w.startsWith( a ) )
    .map( w => w.length )
    .reduce( (acc, v) => Math.max( acc, v ), 0 );

μ°Έκ³  : κΈ°μˆ μ μœΌλ‘œλŠ” μ΅œλŒ€ 배열을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ reduceλ₯Ό μ‚¬μš©ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€. μš°λ¦¬λŠ” 방금 μ“Έ μˆ˜μžˆμ—ˆμŠ΅λ‹ˆλ‹€ :

Math.max( ...wordLengths );

더 λ§Žμ€ μ€€λΉ„κ°€ λ˜μ…¨λ‹€λ©΄μ΄ λΈ”λ‘œκ·Έ κ²Œμ‹œλ¬Όμ—μ„œ 맡 κ°μ†Œ ν•„ν„° μ—°μŠ΅μ„ μ½μ–΄λ³΄μ‹­μ‹œμ˜€. SQL 문을 map-reduce-filter 호좜둜 λ³€ν™˜ν•΄μ•Όν•©λ‹ˆλ‹€.

λΉ„λ””μ˜€ 버전을 μ„ ν˜Έν•˜λŠ” 경우 μ—¬κΈ°μ—μ„œ ν™•μΈν•˜μ‹­μ‹œμ˜€.

<iframe width="560" height="315" src="https://www.youtube.com/embed/uhQptpmffhY" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen=""></iframe>

Summary

κ³ μ°¨ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 인수λ₯Ό λ°›κ±°λ‚˜ ν•¨μˆ˜λ₯Ό λ°˜ν™˜ν•˜λŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€.

당신은 μ•„λ§ˆλ„ 그것듀에 λŒ€ν•΄ μƒκ°ν•˜μ§€ μ•Šκ³  λ§Žμ€ κ³ μ°¨ ν•¨μˆ˜λ₯Ό 이미 μ‚¬μš©ν•˜κ³ μžˆμ„ κ²ƒμž…λ‹ˆλ‹€. setTimeout, 이벀트 λ¦¬μŠ€λ„ˆ 콜백 λ˜λŠ”bind ν•¨μˆ˜λ₯Ό μƒκ°ν•΄λ³΄μ‹­μ‹œμ˜€.

map,reduce 및filter와 같은 일뢀 κ³ μ°¨ ν•¨μˆ˜λŠ” 배열을보닀 μ‰½κ²Œ β€‹β€‹μ²˜λ¦¬ν•˜λŠ” 데 λ„μ›€μ΄λ©λ‹ˆλ‹€.

ν•¨μˆ˜ν˜• ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œ μžμ„Έν•œ λ‚΄μš©μ„ 보렀면 Safari Books Online : Functional Dive into Functional JavaScriptμ—μ„œ 5 μ„±κΈ‰ μ½”μŠ€λ₯Ό ν™•μΈν•˜μ‹­μ‹œμ˜€. /). 이 과정을 κΈ°λŠ₯적 ν”„λ‘œκ·Έλž˜λ°μ— λŒ€ν•œ ν›Œλ₯­ν•œ μž…λ¬Έ 자료둜 κ°•λ ₯히 μΆ”μ²œ ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ•Œλ‘œλŠ” Packt μ‚¬μ΄νŠΈμ—μ„œλ„ λ§Žμ€ 것을 얻을 수 μžˆμŠ΅λ‹ˆλ‹€. Packt의 Deep Dive into Functional JavaScript νŽ˜μ΄μ§€μž…λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ Packt의 ν”„λ‘œλͺ¨μ…˜μ€ λ‚΄κ°€ 관리 ν•  수 β€‹β€‹μ—†μœΌλ―€λ‘œ $ 120- $ 140 κ°€κ²©ν‘œκ°€ 10 λ‹¬λŸ¬λ‘œ ν•˜λ½ν•œμ‹œκΈ°λ₯Ό μ•Œ 수 μ—†μŠ΅λ‹ˆλ‹€.

λ§ˆμ§€λ§‰μœΌλ‘œ JavaScript λ―Έλ‹ˆ μ½”μŠ€μ— κ°€μž…ν•˜λ©΄ 더 λ§Žμ€ 정보λ₯Ό 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

  • arrow functions,
  • destructuring,
  • functions with variable number of arguments,
  • the ES6 class syntax,
  • the spread operator and rest parameters,
  • destructuring.
⚠️ **GitHub.com Fallback** ⚠️