πŸ€” TIL(Today I Learned)

TIL(20210707) - κ³ μ°¨ν•¨μˆ˜

Seungjae Lee 2021. 7. 7. 22:33

🎁 Today

  • 일급 객체의 νŠΉμ§• ν•™μŠ΅
  • κ³ μ°¨ν•¨μˆ˜ κ°œλ… ν•™μŠ΅
  • λ‚΄μž₯ κ³ μ°¨ν•¨μˆ˜(filter, map, reduce)ν•™μŠ΅ 및
    λ‚΄μž₯ κ³ μ°¨ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ κ°„λ‹¨ν•œ μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν’€μ΄

πŸ€” Learned

First-class citizen : 일급객체 - νŠΉλ³„ν•œ λŒ€μš°λ₯Ό λ°›λŠ” ν•¨μˆ˜

λΉ„ν–‰κΈ°μ—λŠ” First classκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이코노미 ν΄λž˜μŠ€μ™€λŠ” νƒ‘μŠΉμˆ˜μ†λΆ€ν„° 기내식, μˆ˜ν•˜λ¬Όμ΄ λ‚˜μ˜€λŠ” μˆœμ„œκΉŒμ§€ 항곡사와 κ΄€λ ¨λœ λͺ¨λ“  λΆ€λΆ„μ—μ„œ ν˜œνƒμ΄ λ‹€λ¦…λ‹ˆλ‹€. First class μ’Œμ„μ„ κ΅¬λ§€ν•œ μ‚¬λžŒμ€ λΉ„μ‹Ό 가격을 치λ₯΄κ³ , ν•­κ³΅μ‚¬λ‘œλΆ€ν„° νŠΉλ³„ν•œ λŒ€μš°λ₯Ό λ°›μŠ΅λ‹ˆλ‹€.

μžλ°”μŠ€ν¬λ¦½νŠΈμ—λ„ νŠΉλ³„ν•œ λŒ€μš°λ₯Ό λ°›λŠ” 일급 객체(first-class citizen)κ°€ μžˆμŠ΅λ‹ˆλ‹€. λŒ€ν‘œμ μΈ 일급 객체 쀑 ν•˜λ‚˜κ°€ ν•¨μˆ˜μž…λ‹ˆλ‹€. (μžλ°”μŠ€ν¬λ¦½νŠΈκ°€ λ‚˜μ˜¨ μ‹œμ μ„ κ³ λ €ν–ˆμ„ λ•Œ,) μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” μ•„λž˜μ™€ 같이 νŠΉλ³„ν•˜κ²Œ μ·¨κΈ‰λ©λ‹ˆλ‹€.

  • λ³€μˆ˜μ— ν• λ‹Ή(assignment) ν•  수 μžˆλ‹€.
  • λ‹€λ₯Έ ν•¨μˆ˜μ˜ 인자(argument)둜 전달될 수 μžˆλ‹€.
  • λ‹€λ₯Έ ν•¨μˆ˜μ˜ κ²°κ³Όλ‘œμ„œ 리턴될 수 μžˆλ‹€.

ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— ν• λ‹Ήν•  수 있기 λ•Œλ¬Έμ—, ν•¨μˆ˜λ₯Ό λ°°μ—΄μ˜ μš”μ†Œλ‚˜ 객체의 μ†μ„±κ°’μœΌλ‘œ μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•¨μˆ˜λ₯Ό 데이터(string, number, boolean, array, object)λ₯Ό 닀루듯이 λ‹€λ£° 수 μžˆλ‹€λŠ” κ±Έ μ˜λ―Έν•©λ‹ˆλ‹€.

  1. λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” 경우

    /*
     * μ•„λž˜λŠ” λ³€μˆ˜ square에 ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•˜λŠ” ν•¨μˆ˜ ν‘œν˜„μ‹μž…λ‹ˆλ‹€.
     * μžλ°”μŠ€ν¬λ¦½νŠΈμ—μ„œ ν•¨μˆ˜λŠ” 일급 객체이기 λ•Œλ¬Έμ— λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
     *
     * ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν• λ‹Ή 전에 μ‚¬μš©ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
     * square(7); // --> ReferenceError: Can't find variable: square
     */
    
    const square = function (num) {
      return num * num;
    };
    
    // squareμ—λŠ” ν•¨μˆ˜κ°€ μ €μž₯λ˜μ–΄ μžˆμœΌλ―€λ‘œ (일급 객체), ν•¨μˆ˜ 호좜 μ—°μ‚°μž '()'λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    output = square(7);
    console.log(output); // --> 49

[μ½”λ“œ] ν•¨μˆ˜ ν‘œν˜„μ‹μ€ λ³€μˆ˜μ— ν• λ‹Ήν•œ λ‹€μŒ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μ—¬λŸ¬λΆ„μ€ 이미 ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” 방법(ν•¨μˆ˜ ν‘œν˜„μ‹)을 ν•™μŠ΅ν–ˆμŠ΅λ‹ˆλ‹€. μœ„μ˜ ν•¨μˆ˜ ν‘œν˜„μ‹(function expression)은 ν•¨μˆ˜ 선언식(function declaration)κ³Ό λ‹€λ₯΄κ²Œ ν˜Έμ΄μŠ€νŒ…(Hoisting)이 μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • ν˜Έμ΄μŠ€νŒ…μ€ μ„ μ–Έλœ μœ„μΉ˜μ— 관계없이 μ–΄λ””μ„œλ“  ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.
  • μ½”λ“œκ°€ μ‹€ν–‰λ˜λŠ” κ³Όμ •μ—μ„œ ν•¨μˆ˜ μ„ μ–ΈλΆ€λ₯Ό μ½”λ“œμ˜ μ΅œμƒλ‹¨μœΌλ‘œ λŒμ–΄μ˜¬λ¦¬λŠ” κ²ƒμ²˜λŸΌ 보이게 ν•©λ‹ˆλ‹€.

ν•¨μˆ˜ μ„ μ–Έμ‹μ˜ ν˜Έμ΄μŠ€νŒ…μ— μ§€λ‚˜μΉ˜κ²Œ μ˜μ‘΄ν•˜λ©΄, μ½”λ“œμ˜ μœ μ§€ λ³΄μˆ˜κ°€ 쉽지 μ•ŠμŠ΅λ‹ˆλ‹€. μ½”λ“œ λ¦¬λ·°λ‚˜ 디버깅을 ν•  λ•Œ, μ½”λ“œλ₯Ό μœ„μ•„λž˜λ‘œ μ™”λ‹€ κ°”λ‹€ ν•˜κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜ 선언식은 μ–΄λŠ μœ„μΉ˜μ—λ‚˜ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 있고, ν•¨μˆ˜μ˜ μ‹€ν–‰ μœ„μΉ˜λ„ μ€‘μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ°˜λ©΄μ— ν•¨μˆ˜ ν‘œν˜„μ‹μ€ ν•¨μˆ˜μ˜ ν• λ‹Ήκ³Ό μ‹€ν–‰μ˜ μœ„μΉ˜μ— 따라 κ²°κ³Όκ°€ 달라지기 λ•Œλ¬Έμ—, μ½”λ“œμ˜ μœ„μΉ˜λ₯Ό μ–΄λŠ 정도 μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν˜Έμ΄μŠ€νŒ…μ„ μ œμ™Έν•˜λ©΄, ν•¨μˆ˜ 선언식과 ν•¨μˆ˜ ν‘œν˜„μ‹μ€ 크게 차이가 μ—†μŠ΅λ‹ˆλ‹€. λ‹€λ§Œ, ν•¨μˆ˜ ν‘œν˜„μ‹μ˜ κ²½μš°λŠ” ν•¨μˆ˜κ°€ λ³€μˆ˜μ— μ €μž₯될 수 μžˆλ‹€λŠ” 사싀을 보닀 λΆ„λͺ…ν•˜κ²Œ 보여 μ€λ‹ˆλ‹€.

그리고 ν•¨μˆ˜λŠ” λ³€μˆ˜μ— μ €μž₯된 데이터λ₯Ό 인자둜 λ°›κ±°λ‚˜, 리턴 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. ν•¨μˆ˜λ„ λ³€μˆ˜μ— μ €μž₯될 수 있기 λ•Œλ¬Έμ— ν•¨μˆ˜λ₯Ό 인자둜 λ°›κ±°λ‚˜, 리턴 κ°’μœΌλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄μ–΄μ§€λŠ” μ½˜ν…μΈ λ₯Ό 톡해 μžλ°”μŠ€ν¬λ¦½νŠΈμ˜ κ³ κΈ‰ 주제, κ³ μ°¨ ν•¨μˆ˜(higher order function)λ₯Ό ν•™μŠ΅ν•©λ‹ˆλ‹€.


κ³ μ°¨ ν•¨μˆ˜λž€

κ³ μ°¨ ν•¨μˆ˜(higher order function)λŠ” ν•¨μˆ˜λ₯Ό 인자(argument)둜 받을 수 있고, ν•¨μˆ˜μ˜ ν˜•νƒœλ‘œ 리턴할 수 μžˆλŠ” ν•¨μˆ˜μž…λ‹ˆλ‹€. 이전 μ½˜ν…μΈ μ—μ„œ ν™•μΈν–ˆλ“―μ΄, ν•¨μˆ˜λŠ” λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 ν•¨μˆ˜λŠ”, ν•¨μˆ˜λ₯Ό 담은 λ³€μˆ˜λ₯Ό 인자둜 전달받을 수 μžˆμŠ΅λ‹ˆλ‹€. λ§ˆμ°¬κ°€μ§€λ‘œ, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ λ³€μˆ˜μ— ν•¨μˆ˜λ₯Ό ν• λ‹Ήν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그리고 ν•¨μˆ˜λŠ” 이 λ³€μˆ˜λ₯Ό 리턴할 수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ λ³€μˆ˜μ— ν• λ‹Ήν•˜μ§€ μ•Šκ³  ν•¨μˆ˜λ₯Ό λ°”λ‘œ μ΄μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ–΄λ–€ κ³ μ°¨ ν•¨μˆ˜μ— ν•¨μˆ˜λ₯Ό 인자둜 μ „λ‹¬ν•˜κ³ , κ³ μ°¨ ν•¨μˆ˜λŠ” ν•¨μˆ˜ 자체λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€. λ³€μˆ˜κ°€ λΉ μ‘Œμ„ 뿐, λ™μΌν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

μ΄λ•Œ λ‹€λ₯Έ ν•¨μˆ˜(caller)의 인자(argument)둜 μ „λ‹¬λ˜λŠ” ν•¨μˆ˜λ₯Ό 콜백 ν•¨μˆ˜(callback function)라고 ν•©λ‹ˆλ‹€. 콜백 ν•¨μˆ˜μ˜ 이름은, μ–΄λ–€ μž‘μ—…μ΄ μ™„λ£Œλ˜μ—ˆμ„ λ•Œ ν˜ΈμΆœν•˜λŠ” κ²½μš°κ°€ λ§Žμ•„μ„œ, λ‹΅μ‹  μ „ν™”λ₯Ό λœ»ν•˜λŠ” μ½œλ°±μ΄λΌλŠ” 이름이 λΆ™μ—¬μ‘ŒμŠ΅λ‹ˆλ‹€.

콜백 ν•¨μˆ˜λ₯Ό 전달받은 κ³ μ°¨ ν•¨μˆ˜λŠ”, ν•¨μˆ˜ λ‚΄λΆ€μ—μ„œ 이 콜백 ν•¨μˆ˜λ₯Ό 호좜(invoke) ν•  수 μžˆμŠ΅λ‹ˆλ‹€. callerλŠ” 쑰건에 따라 콜백 ν•¨μˆ˜μ˜ μ‹€ν–‰ μ—¬λΆ€λ₯Ό κ²°μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„μ˜ˆ ν˜ΈμΆœν•˜μ§€ μ•Šμ„ μˆ˜λ„ 있고, μ—¬λŸ¬ 번 μ‹€ν–‰ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. νŠΉμ • μž‘μ—…μ˜ μ™„λ£Œ 후에 ν˜ΈμΆœν•˜λŠ” κ²½μš°λŠ” 이후에 μΆ©λΆ„νžˆ μ ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

'ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜'λŠ” λͺ¨μ–‘μƒˆκ°€ νŠΉμ΄ν•œ 만큼, λΆ€λ₯΄λŠ” μš©μ–΄κ°€ λ”°λ‘œ μžˆμŠ΅λ‹ˆλ‹€. 'ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜'λ₯Ό κ³ μ•ˆν•΄ λ‚Έ λ…Όλ¦¬ν•™μž ν•˜μŠ€μΌˆ 컀리(Haskell Curry)의 이름을 λ”°, 컀리 ν•¨μˆ˜λΌκ³  ν•©λ‹ˆλ‹€. λ”°λ‘œ 컀리 ν•¨μˆ˜λΌλŠ” μš©μ–΄λ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°μ—λŠ”, κ³ μ°¨ ν•¨μˆ˜λž€ μš©μ–΄λ₯Ό 'ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜'μ—λ§Œ ν•œμ •ν•΄ μ‚¬μš©ν•˜κΈ°λ„ ν•©λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ μ •ν™•ν•˜κ²Œ κ΅¬λΆ„ν•˜μžλ©΄, κ³ μ°¨ ν•¨μˆ˜κ°€ 컀리 ν•¨μˆ˜λ₯Ό ν¬ν•¨ν•©λ‹ˆλ‹€. 이번 μœ λ‹›λΆ€ν„°λŠ” 'ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜'와 'ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” ν•¨μˆ˜' λͺ¨λ‘, μš©μ–΄λ₯Ό κ³ μ°¨ ν•¨μˆ˜λ‘œ μ‚¬μš©ν•©λ‹ˆλ‹€.

  1. λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” 경우

    function double(num) {
      return num * 2;
    }
    
    function doubleNum(func, num) {
      return func(num);
    }
    
    /*
     * ν•¨μˆ˜ doubleNum은 λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό 인자둜 λ°›λŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.
     * ν•¨μˆ˜ doubleNum의 첫 번째 인자 func에 ν•¨μˆ˜κ°€ λ“€μ–΄μ˜¬ 경우
     * ν•¨μˆ˜ funcλŠ” ν•¨μˆ˜ doubleNum의 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.
     * μ•„λž˜μ™€ 같은 경우, ν•¨μˆ˜ double은 ν•¨μˆ˜ doubleNum의 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.
     */
    let output = doubleNum(double, 4);
    console.log(output); // -> 8
  2. ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” 경우

    function adder(added) {
      return function (num) {
        return num + added;
      };
    }
    
    /*
     * ν•¨μˆ˜ adderλŠ” λ‹€λ₯Έ ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.
     * adderλŠ” 인자 ν•œ 개λ₯Ό μž…λ ₯λ°›μ•„μ„œ ν•¨μˆ˜(읡λͺ… ν•¨μˆ˜)λ₯Ό λ¦¬ν„΄ν•©λ‹ˆλ‹€.
     * λ¦¬ν„΄λ˜λŠ” 읡λͺ… ν•¨μˆ˜λŠ” 인자 ν•œ 개λ₯Ό λ°›μ•„μ„œ added와 λ”ν•œ 값을 λ¦¬ν„΄ν•©λ‹ˆλ‹€.
     */
    
    // adder(5)λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ ν•¨μˆ˜ 호좜 μ—°μ‚°μž '()'λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    let output = adder(5)(3); // -> 8
    console.log(output); // -> 8
    
    // adderκ°€ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    // javascriptμ—μ„œ ν•¨μˆ˜λŠ” 일급 객체이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.
    const add3 = adder(3);
    output = add3(2);
    console.log(output); // -> 5
  3. ν•¨μˆ˜λ₯Ό 인자둜 λ°›κ³ , ν•¨μˆ˜λ₯Ό λ¦¬ν„΄ν•˜λŠ” 경우

    function double(num) {
      return num * 2;
    }
    
    function doubleAdder(added, func) {
      const doubled = func(added);
      return function (num) {
        return num + doubled;
      };
    }
    
    /*
     * ν•¨μˆ˜ doubleAdderλŠ” κ³ μ°¨ ν•¨μˆ˜μž…λ‹ˆλ‹€.
     * ν•¨μˆ˜ doubleAdder의 인자 funcλŠ” ν•¨μˆ˜ doubleAdder의 콜백 ν•¨μˆ˜μž…λ‹ˆλ‹€.
     * ν•¨μˆ˜ double은 ν•¨μˆ˜ doubleAdder의 콜백으둜 μ „λ‹¬λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
     */
    
    // doubleAdder(5, double)λŠ” ν•¨μˆ˜μ΄λ―€λ‘œ ν•¨μˆ˜ 호좜 기호 '()'λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    doubleAdder(5, double)(3); // -> 13
    
    // doubleAdderκ°€ λ¦¬ν„΄ν•˜λŠ” ν•¨μˆ˜λ₯Ό λ³€μˆ˜μ— μ €μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. (일급 객체)
    const addTwice3 = doubleAdder(3, double);
    addTwice3(2); // --> 8

λ‚΄μž₯ κ³ μ°¨ν•¨μˆ˜(filter, map, reduce)

λ©”μ†Œλ“œ(filter, map, reduce)λŠ” this(원본 λ°°μ—΄)λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€πŸ”’

1. Array.prototype.filter(callback: (element, index: number, array) => thisArg?: any) ;

  • filter λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λ©΄ if 문을 λŒ€μ²΄ν•  수 μžˆλ‹€.
  • 배열을 μˆœνšŒν•˜λ©° 각 μš”μ†Œμ— λŒ€ν•˜μ—¬ 인자둜 μ£Όμ–΄μ§„ μ½œλ°±ν•¨μˆ˜μ˜ μ‹€ν–‰ κ²°κ³Όκ°€ true인 λ°°μ—΄ μš”μ†Œμ˜ κ°’λ§Œμ„ μΆ”μΆœν•œ μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€.
  • λ°°μ—΄μ—μ„œ νŠΉμ • μΌ€μ΄μŠ€λ§Œ 필터링 쑰건으둜 μΆ”μΆœν•˜μ—¬ μƒˆλ‘œμš΄ 배열을 λ§Œλ“€κ³  싢을 λ•Œ μ‚¬μš©ν•œλ‹€. μ΄λ•Œ 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.
  • 콜백 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ°°μ—΄ μš”μ†Œμ˜ κ°’, μš”μ†Œ 인덱슀, filter λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄, 즉 thisλ₯Ό 전달 받을 수 μžˆλ‹€.
  • IE 9 μ΄μƒμ—μ„œ 정상 λ™μž‘ν•œλ‹€.
const result = [1, 2, 3, 4, 5].filter(function (item, index, self) {
  console.log(`[${index}] = ${item}`);
  return item % 2; // ν™€μˆ˜λ§Œμ„ ν•„ν„°λ§ν•œλ‹€ (1은 true둜 ν‰κ°€λœλ‹€)
});

// [0] = 1
// [1] = 2
// [2] = 3
// [3] = 4
// [4] = 5
console.log(result); // [ 1, 3, 5 ]

2. Array.prototype.map(callback: (element, index: number, array) => thisArg?: any);

  • 배열을 μˆœνšŒν•˜λ©° 각 μš”μ†Œμ— λŒ€ν•˜μ—¬ 인자둜 μ£Όμ–΄μ§„ 콜백 ν•¨μˆ˜μ˜ λ°˜ν™˜κ°’(κ²°κ³Όκ°’)으둜 μƒˆλ‘œμš΄ 배열을 μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•œλ‹€. μ΄λ•Œ 원본 배열은 λ³€κ²½λ˜μ§€ μ•ŠλŠ”λ‹€.
  • forEach λ©”μ†Œλ“œλŠ” 배열을 μˆœνšŒν•˜λ©° μš”μ†Œ 값을 μ°Έμ‘°ν•˜μ—¬ 무언가λ₯Ό ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜μ΄λ©° map λ©”μ†Œλ“œλŠ” 배열을 μˆœνšŒν•˜λ©° μš”μ†Œ 값을 λ‹€λ₯Έ κ°’μœΌλ‘œ λ§΅ν•‘ν•˜κΈ° μœ„ν•œ ν•¨μˆ˜μ΄λ‹€.

map

Array.prototype.map

  • 콜백 ν•¨μˆ˜μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό 톡해 λ°°μ—΄ μš”μ†Œμ˜ κ°’, μš”μ†Œ 인덱슀, map λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄, 즉 thisλ₯Ό 전달 받을 수 μžˆλ‹€.
  • IE 9 μ΄μƒμ—μ„œ 정상 λ™μž‘ν•œλ‹€.
const numbers = [1, 4, 9];

// 배열을 μˆœνšŒν•˜λ©° 각 μš”μ†Œμ— λŒ€ν•˜μ—¬ 인자둜 μ£Όμ–΄μ§„ μ½œλ°±ν•¨μˆ˜λ₯Ό μ‹€ν–‰
const roots = numbers.map(function (item) {
  // λ°˜ν™˜κ°’μ΄ μƒˆλ‘œμš΄ λ°°μ—΄μ˜ μš”μ†Œκ°€ λœλ‹€. λ°˜ν™˜κ°’μ΄ μ—†μœΌλ©΄ μƒˆλ‘œμš΄ 배열은 λΉ„μ–΄ μžˆλ‹€.
  return Math.sqrt(item);
});

// μœ„ μ½”λ“œμ˜ μΆ•μ•½ν‘œν˜„μ€ μ•„λž˜μ™€ κ°™λ‹€.
// const roots = numbers.map(Math.sqrt);

// map λ©”μ†Œλ“œλŠ” μƒˆλ‘œμš΄ 배열을 λ°˜ν™˜ν•œλ‹€
console.log(roots);   // [ 1, 2, 3 ]
// map λ©”μ†Œλ“œλŠ” 원본 배열은 λ³€κ²½ν•˜μ§€ μ•ŠλŠ”λ‹€
console.log(numbers); // [ 1, 4, 9 ]

3. Array.prototype.reduce(callback: (accumulator, currentValue, index: number, array) => accumulator + currentValue);

배열을 μˆœνšŒν•˜λ©° 각 μš”μ†Œμ— λŒ€ν•˜μ—¬ μ΄μ „μ˜ μ½œλ°±ν•¨μˆ˜ μ‹€ν–‰ λ°˜ν™˜κ°’μ„ μ „λ‹¬ν•˜μ—¬ μ½œλ°±ν•¨μˆ˜λ₯Ό μ‹€ν–‰ν•˜κ³  κ·Έ κ²°κ³Όλ₯Ό λ°˜ν™˜ν•œλ‹€. IE 9 μ΄μƒμ—μ„œ 정상 λ™μž‘ν•œλ‹€.

const arr = [1, 2, 3, 4, 5];

/*
previousValue: 이전 콜백의 λ°˜ν™˜κ°’
currentValue : λ°°μ—΄ μš”μ†Œμ˜ κ°’
currentIndex : 인덱슀
array        : λ©”μ†Œλ“œλ₯Ό ν˜ΈμΆœν•œ λ°°μ—΄, 즉 this
*/
// ν•©μ‚°
const sum = arr.reduce(function (previousValue, currentValue, currentIndex, self) {
  console.log(previousValue + '+' + currentValue + '=' + (previousValue + currentValue));
  return previousValue + currentValue; // κ²°κ³ΌλŠ” λ‹€μŒ 콜백의 첫번째 인자둜 μ „λ‹¬λœλ‹€
});

console.log(sum); // 15: 1~5κΉŒμ§€μ˜ ν•©
/*
1: 1+2=3
2: 3+3=6
3: 6+4=10
4: 10+5=15
15
*/

// μ΅œλŒ€κ°’ 취득
const max = arr.reduce(function (pre, cur) {
  return pre > cur ? pre : cur;
});

console.log(max); // 5: μ΅œλŒ€κ°’

reduce

🌈 Tomorrow

  • κ³ μ°¨ν•¨μˆ˜ 볡슡
  • μ•Œκ³ λ¦¬μ¦˜ λ¬Έμ œν’€μ΄