[JS] ๊ณ ์ฐจํ•จ์ˆ˜

Updated:

Categories:

Tags: ,

๐Ÿ“Œ ๊ฐœ์ธ์ ์ธ ๊ณต๊ฐ„์œผ๋กœ ๊ณต๋ถ€๋ฅผ ๊ธฐ๋กํ•˜๊ณ  ๋ณต์Šตํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋ธ”๋กœ๊ทธ์ž…๋‹ˆ๋‹ค.
์ •ํ™•ํ•˜์ง€ ์•Š์€ ์ •๋ณด๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐธ๊ณ ๋ฐ”๋ž๋‹ˆ๋‹ค :๐Ÿ˜ธ
[ํ‹€๋ฆฐ ๋‚ด์šฉ์€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ณต๋ฐ›์œผ์‹ค๊ฑฐ์—์š”]

๐Ÿ’ ์˜ค๋Š˜ ๋ฐฐ์šด ์ด๋ก  ์š”์•ฝ


  1. Javascript์—์„œ๋Š” ํŠน๋ณ„ํ•œ ๋Œ€์šฐ๋ฅผ ๋ฐ›๋Š” ์ผ๊ธ‰ ๊ฐ์ฒด๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ํ•จ์ˆ˜. ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค
    1. ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๊ณ  ํ•จ์ˆ˜๋ฅผ ๋ฐฐ์—ด์˜ ์š”์†Œ๋‚˜ ๊ฐ์ฒด์˜ ์†์„ฑ ๊ฐ’์œผ๋กœ ์ €์žฅ ๊ฐ€๋Šฅ
    2. ํ•จ์ˆ˜๋ฅผ ๋ฐ์ดํ„ฐ์ฒ˜๋Ÿผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ
  2. ๊ณ ์ฐจํ•จ์ˆ˜ : ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ , ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์ด๋‹ค.
  3. ์ฝœ๋ฐฑํ•จ์ˆ˜ : ๋‹ค๋ฅธํ•จ์ˆ˜์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜
  4. JavaScript์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋œ ๊ณ ์ฐจ ํ•จ์ˆ˜
    1. Array.filter()
    2. Array.Map()
    3. Array.reduce()


๊ณ ์ฐจํ•จ์ˆ˜๋ž€?

  1. ๊ณ ์ฐจ ํ•จ์ˆ˜(higher order function)
    1. ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž(argument)๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ณ ,
    2. ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜ (=ํด๋กœ์ €)
    3. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›์€ ๊ณ ์ฐจ ํ•จ์ˆ˜(caller)๋Š”, ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ด ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ(invoke)ํ•  ์ˆ˜ ์žˆ๊ณ , ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜๋„ ์žˆ์Œ
    4. ์•„์˜ˆ ํ˜ธ์ถœํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Œ
    5. ํŠน์ • ์ž‘์—…์˜ ์™„๋ฃŒ ํ›„์— ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์ดํ›„์— ์ถฉ๋ถ„ํžˆ ์ ‘ํ•  ์ˆ˜ ์žˆ์Œ.
  2. ์ฝœ๋ฐฑํ•จ์ˆ˜ (callback function)
    1. ๋‹ค๋ฅธ ํ•จ์ˆ˜(caller)์˜ ์ „๋‹ฌ์ธ์ž(argument)๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜
    2. ์–ด๋–ค ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ์„ ๋•Œ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•„์„œ, ๋‹ต์‹  ์ „ํ™”๋ฅผ ๋œปํ•˜๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™์—ฌ์ง
  3. ์ปค๋งํ•จ์ˆ˜
    1. โ€˜ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜โ€™๋ฅผ ๊ณ ์•ˆํ•ด ๋‚ธ ๋…ผ๋ฆฌํ•™์ž ํ•˜์Šค์ผˆ ์ปค๋ฆฌ(Haskell Curry)์˜ ์ด๋ฆ„์„ ๋”ฐ์„œ ์ง€์Œ
    2. ๋”ฐ๋กœ ์ปค๋ง ํ•จ์ˆ˜๋ผ๋Š” ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ๊ณ ์ฐจ ํ•จ์ˆ˜๋ผ๋Š” ์šฉ์–ด๋ฅผ โ€˜ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๋Š” ํ•จ์ˆ˜โ€™์—๋งŒ ํ•œ์ •ํ•ด ์‚ฌ์šฉ
    3. ์ •ํ™•ํ•˜๊ฒŒ ๊ตฌ๋ถ„ํ•˜์ž๋ฉด, ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ์ปค๋ง ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ์Œ
  4. ๊ณ ์ฐจํ•จ์ˆ˜ ์˜ˆ์ œ
    1. ์˜ˆ์ œ 1_ ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ฒฝ์šฐ

      1
      2
      3
      4
      5
      6
      7
      
       function double(num) {
         return num * 2;
       }
              
       function doubleNum(func, num) {
         return func(num);
       }
      
      1. doubleNum : ๋‹ค๋ฅธ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ณ ์ฐจํ•จ์ˆ˜
      2. doubleNum์˜ ๋งค๊ฐœ์ธ์ž์ธ func๋Š” doubleNum์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ํ•ด๋‹น
      3. let result = doubleNum(double,6) ์˜ ๊ฒฝ์šฐ double์ด ํ•จ์ˆ˜ doubleNum์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋จ.
      4. iii์˜ ๊ฒฐ๊ณผ๋Š” ์ฝ˜์†”์— ์ž…๋ ฅ์‹œ console.log(result); โ†’ 12๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.
    2. ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ

      1
      2
      3
      4
      5
      
       function adder(added) {
         return function (num) {
           return num + added;
         };
       }
      
      1. adder๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜, ์ธ์ž ํ•œ๊ฐœ๋ฅผ ์ž…๋ ฅ ๋ฐ›์•„ ํ•จ์ˆ˜(์ต๋ช… ํ•จ์ˆ˜)๋ฅผ return ํ•จ
      2. ์ต๋ช… ํ•จ์ˆ˜๋Š” ์ธ์ž ํ•œ ๊ฐœ๋ฅผ ๋ฐ›์•„์„œ added์™€ ๋”ํ•œ ๊ฐ’์„ ๋ฆฌํ„ด ํ•จ.
      3. let result=adder(5)(3); ์€ adder์˜ ๋งค๊ฐœ์ธ์ž๋กœ 5, ์ต๋ช…ํ•จ์ˆ˜์˜ ๋งค๊ฐœ์ธ์ž๋กœ num=3์ด ๋“ค์–ด๊ฐ€ ๊ฒฐ๊ณผ๋Š” 8์ด ๋œ๋‹ค.
      4. adder๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅ๋„ ๊ฐ€๋Šฅ โ‡’ js์—์„œ ํ•จ์ˆ˜๊ฐ€ ์ผ๊ธ‰๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ

        1
        2
        3
        
         const adderResult = adder(4);
         const result = adderResult(3);
         console.log(result); //->7์ด ์ถœ๋ ฅ๋จ.
        
    3. ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ๋ฐ›๊ณ , ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
       function double(num) {
         return num * 2;
       }
              
       function doubleAdder(added, func) {
         const doubled = func(added);
         return function (num) {
           return num + doubled;
         };
       }
      
      1. doubleAdder : ๊ณ ์ฐจํ•จ์ˆ˜, doubleAdder์˜ ๋งค๊ฐœ์ธ์ž func๋Š” doubleAdder์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜
      2. doubleAdder(5, double)(3); ์˜ ๊ฒฝ์šฐ doubleํ•จ์ˆ˜๋Š” doubleAdder์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜

๋‚ด์žฅ ๊ณ ์ฐจํ•จ์ˆ˜

๋‚ด์žฅ ๊ณ ์ฐจํ•จ์ˆ˜๋ž€?

  • JavaScript์—๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋œ ๊ณ ์ฐจ ํ•จ์ˆ˜ ์žˆ์Œ =๊ทธ ์ค‘์—์„œ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋“ค ์ค‘ ์ผ๋ถ€๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ๊ณ ์ฐจ ํ•จ์ˆ˜์— ํ•ด๋‹น

filter

  • ๋ฐฐ์—ด์˜ filter ๋ฉ”์„œ๋“œ
  • ๋ชจ๋“  ๋ฐฐ์—ด์˜ ์š”์†Œ ์ค‘์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฉ”์„œ๋“œ
  • ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋ช…์‹œํ•œ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ฐจ ํ•จ์ˆ˜์— ํ•ด๋‹น
  1. ๋™์ž‘ ๋ฐฉ์‹

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
     	 Array.prototype.filter = function(func) {
     	    const arr = this;
     		  const newArr = []
     	    for(let i = 0; i < arr.length; i++) {
        	    
     	    //filter์— ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” arr์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํ˜ธ์ถœ
     	    // ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ true๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€
        	    
     	      if (func(arr[i]) === true) {
     	       newArr.push(this[i])	      }
         }
        return newArr; //์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ true์ธ ์š”์†Œ๋“ค๋งŒ ์ €์žฅ๋œ ๋ฐฐ์—ด์„ ๋ฆฌํ„ด
       }
        
    
  2. ์‚ฌ์šฉ์˜ˆ์‹œ
    1. ์˜ˆ์ œ 1

      1
      2
      3
      4
      5
      6
      7
      
       let arr = [1, 2, 3, 4];
              
       function isEven(num) {
       	return num % 2 === 0;
       }
              
       arr.filter(arr, isEven);
      
      1. ๋ฐฐ์—ด์˜ ์š”์†Œ ์ค‘ ์ง์ˆ˜๋งŒ filter๋˜์–ด ๊ฒฐ๊ณผ๋Š” [2,4]
    2. ์˜ˆ์ œ 2

      1
      2
      3
      4
      5
      6
      7
      
              
       const isLteFive = function (str) {   // Lte = less then equal
         return str.length <= 5;
       };
       arr = ['hello', 'code', 'javaspring', 'happy', 'hacking'];
              
       let output = arr.filter(isLteFive);
      
      1. โ€˜๊ธธ์ด 5 ์ดํ•˜โ€™๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์กฐ๊ฑด์œผ๋กœ์„œ filter ๋ฉ”์„œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ
      2. ๊ฒฐ๊ณผ : output = [โ€˜helloโ€™, โ€˜codeโ€™, โ€˜happyโ€™]
  3. ๋ฌธ์ œ -1
    1. ๋งŒํ™”์ฑ… ์‹๊ฐ 27๊ถŒ์˜ ์ •๋ณด๊ฐ€ ๋ฐฐ์—ด(Cartoons)์— ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค. ์ถœํŒ ์—ฐ๋„๊ฐ€ 2003๋…„์ธ ๋‹จํ–‰๋ณธ๋งŒ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋งŒ๋“œ์„ธ์š”.

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      
       const cartoons = [
         {
           id: 1,
           bookType: 'cartoon',
           title: '์‹๊ฐ',
           subtitle: '์–ด๋จธ๋‹ˆ์˜ ์Œ€',
           createdAt: '2003-09-09',
           genre: '์š”๋ฆฌ',
           artist: 'ํ—ˆ์˜๋งŒ',
           averageScore: 9.66,
         },
         {...},...,{...}];
      
    2. ๋‚ด๊ฐ€ ํ‘ผ ํ’€์ด

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
       const eqaulYear=function(cartoon,year){
         let resultArr=[];
           for(let i =0 ;i<cartoon.length; i++){
             if(cartoon[i].createdAt.slice(0,4)===year){
                 resultArr.push(cartoon[i]);
             }
           }
           return resultArr;
       } 
        console.log(eqaulYear(cartoons,'2003'));
      

      1. ์•„์ง filter๊ฐ€ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ for๋ฌธ์œผ๋กœ ํ’€์—ˆ์Œ ์‚ฌ์‹ค, ๊ณ ์ฐจํ•จ์ˆ˜๋ฅผ ์จ๋ณธ ์ ์ด ์—†๊ณ  ๋ฌธ์ œ ๋ณด์ž๋งˆ์ž for๋ฌธ๋งŒ ์ƒ๊ฐ๋‚ฌ์Œ
      2. ๊ฒฐ๊ณผ๋Š” ๋งž๊ฒŒ ๋‚˜์˜ด
      3. filter๋Š” ์ด๋ฏธ ๊ตฌํ˜„๋œ ํ•จ์ˆ˜! ํ•„ํ„ฐ ๋งค๊ฐœ์ธ์ž๋กœ ํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์™€์•ผ ํ•˜๊ณ , filter๋‚ด์— ํ•จ์ˆ˜๊ฐ€ true์ธ ์š”์†Œ๋“ค๋งŒ ๋‹ด์•„์„œ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋Š” ๊ฒƒ ๊ธฐ์–ตํ•˜๊ธฐ!
      4. slice ๋ฉ”์„œ๋“œ๋กœ ๊ตฌํ˜„ํ–ˆ๋Š”๋ฐ ์•„๋ž˜ referece ๋ณด๋ฉด js์—์„œ๋Š” ๋‚ด์žฅ๊ฐ์ฒด์ธ Date()๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์‰ฝ๊ฒŒ ์—ฐ๋„๋ฅผ ๋”ฐ๋กœ ๊ตฌํ•  ์ˆ˜ ์žˆ์Œ
        1. ์•„๋ž˜ ๋งํฌ ์ฐธ์กฐ (https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Date/getFullYear)
    3. reference

      1
      2
      3
      4
      5
      6
      7
      
       const isCreatedAt2003 = function(cartoon,year){
       		const createdYear = new Date(cartoon.createdAt).getFullYear();
       		return createdYear===year;
       		};
              
       const resultArr = cartoons.filter(iscreatedAt2003,2003);
       console.log(resultArr);
      
      1. Date๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ์ž๋ฅผ ๋งŒ๋“ค์–ด ๋ฉ”์„œ๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜ด
      2. ๋ฐฐ์—ด๊ณผ, ์—ฐ๋„๋ฅผ ๋งค๊ฐœ์ธ์ž๋กœ ํ•˜๋Š” isCreatedAt2003 ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด filter์˜ ๋งค๊ฐœ์ธ์ž๋กœ ์‚ฌ์šฉํ•˜์˜€์Œ.
      3. ๊ฒฐ๊ณผ๋Š” ๋™์ผํ•˜๋‹ค.

map

  1. map ํ™œ์šฉ์‹œ์—๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€ ํŠน์ • ๋…ผ๋ฆฌ์— ์˜ํ•ด ๋‹ค๋ฅธ์š”์†Œ๋กœ ์ง€์ •๋˜๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜๊ธฐ
  2. ๋ฌธ์ œ-2
    1. ๋งŒํ™”์ฑ… ์‹๊ฐ 27๊ถŒ์˜ ์ •๋ณด๊ฐ€ ๋ฐฐ์—ด์— ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ์ฑ…์˜ ๋ถ€์ œ(subtitle)๋งŒ ๋‹ด์€ ๋ฐฐ์—ด์„ ๋งŒ๋“œ์„ธ์š”.
    2. ์ˆ˜๋„ ์ฝ”๋“œ
      • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ : ๊ฐ ์‹๊ฐ 1- 27๊ถŒ์˜ ์ •๋ณด
      • ํŠน์ • ๋…ผ๋ฆฌ(ํ•จ์ˆ˜) : ์ฑ… ํ•œ ๊ถŒ์˜ ๋ถ€์ œ๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค.
      • ๋‹ค๋ฅธ ์š”์†Œ๋กœ ์ง€์ • : ๊ฐ ์‹๊ฐ 1- 27๊ถŒ์˜ ๋ถ€์ œ
    3. ๋‚˜์˜ ํ’€์ด

      1
      2
      3
      4
      5
      
       const findSubtitle=function(cartoon){
         return cartoon.subtitle;
       }
       const subtitles=cartoons.map(findSubtitle);
       console.log(subtitles);
      
    4. ์ถœ๋ ฅ ๊ฒฐ๊ณผ

    5. ์˜ค๋ฅ˜ ๋ฐœ์ƒ
      1. ์˜ค๋ฅ˜๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์ถœ๋ ฅ์ด ๊ณ„์† ์•ˆ๋จ, ํ‹€๋ฆฐ ํ’€์ด

        1
        2
        3
        4
        5
        6
        
         const findSubtitle=function(cartoon){
           return cartoon.subtitle;
         }
                    
         const subtitles= map(findSubtitle,cartoons);
         console.log(subtitles);
        
      2. ๋ฐฐ์—ด์˜ ๋‚ด์žฅ ๊ณ ์ฐจํ•จ์ˆ˜์ด๋ฏ€๋กœ ๋ฐฐ์—ด.map(func)๋กœ ํ• ๋‹นํ•ด์•ผ ํ•จ.

reduce

reduce๋Š” ์ค‘์š”ํ•˜๊ธฐ๋„ํ•˜๊ณ  ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ๋น„ํ•ด ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๊ฐ€๊ณ  ๋”ฐ๋กœ ์ •๋ฆฌ๋œ ๊ฒƒ ์ž๋ฃŒ๋„ ์—†์–ด์„œ MDN๋ณด๊ณ  ์ดํ•ดํ•จ,,

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce#try_it


Array.prototype.reduce(callbackFn)

  • ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆœํšŒํ•˜์—ฌ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ค„์—ฌ return
  • reduce(callbackFn) ๋˜๋Š” reduce(callbackFn. initValue) ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ 
  • callbackFn์€ 4๊ฐœ์˜ ์ธ์ž๋ฅผ ๋ฐ›์Œ (accumulator , currentValue , currentIdx, array)
    • accumulator : callbackํ•จ์ˆ˜์˜ ๋ฐ˜ํ™˜๊ฐ’์„ ๋ˆ„์ 
    • currentValue : ๋ฐฐ์—ด์˜ ํ˜„์žฌ ๊ฐ’
    • currentIdx (Optional) : ๋ฒ ์—ด์˜ ํ˜„์žฌ ๊ฐ’์˜ ์ธ๋ฑ
    • array (Optional) : ํ˜ธ์ถœํ•œ ๋ฐฐ์—ด
  • initValue(Optional)๊ฐ€ ์ง€์ •๋œ ๊ฒฝ์šฐ ์ฝœ๋ฐฑ์ด ์ฒ˜์Œ ํ˜ธ์ถœ๋  ๋•Œ ์ดˆ๊ธฐํ™” ๋˜๋Š” ๊ฐ’์ด๋ฉฐ (initValue=acummulator, currentValue๋Š” ์ฒซ ๋ฒˆ์งธ ๊ฐ’)
  • initValue ์—†์ด ๋งค๊ฐœ์ธ์ž๊ฐ€ ์ฝœ๋ฐฑํ•จ์ˆ˜ 1๊ฐœ๋งŒ ์˜ฌ ๊ฒฝ์šฐ์—๋Š”ย accumulator๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ฐ’์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๊ณ ย callbackFn๋ฐฐ์—ด์˜ ๋‘ ๋ฒˆ์งธ ๊ฐ’(currentValue)์œผ๋กœ ์‹คํ–‰
  • ์˜ˆ์ œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
      const array = [15, 16, 17, 18, 19];
        
      function reducer(accumulator, currentValue, index) {
        const returns = accumulator + currentValue;
        console.log(
          `accumulator: ${accumulator}, currentValue: ${currentValue},index: ${index}, returns: ${returns}`,
        );
        return returns;
      }
        
      array.reduce(reducer);
        
    
    • ๊ฒฐ๊ณผ

      ๐Ÿ’ accumulator currentValue index ๋ฐ˜ํ™˜ ๊ฐ’
      First call 15 16 1 31
      Second call 31 17 2 48
      Third call 48 18 3 66
      Fourth call 66 19 4 85


      • array๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ํ†ตํ•ด ์ ˆ๋Œ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค
      • ๋ฐ˜ํ™˜๋˜๋Š” ๊ฐ’์€ย reduce()๋งˆ์ง€๋ง‰ ์ฝœ๋ฐฑ ( )์˜ ๊ฐ’์ž…๋‹ˆ๋‹คย : 85.

  1. reduce ํ™œ์šฉ์‹œ์—๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€ ํŠน์ • ๋ฐฉ๋ฒ•(ํ•จ์ˆ˜)์— ๋”ฐ๋ผ ์›ํ•˜๋Š” ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ ์‘์ถ•ํ•˜๋Š” ๊ฒƒ ์ดํ•ดํ•˜๊ธฐ.
  2. ๋ฌธ์ œ -3
    1. ๋งŒํ™”์ฑ… ์‹๊ฐ 27๊ถŒ์˜ ์ •๋ณด๊ฐ€ ๋ฐฐ์—ด์— ๋‹ด๊ฒจ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋‹จํ–‰๋ณธ์˜ ํ‰์ ์˜ ํ‰๊ท ์„ ๋ฆฌํ„ดํ•˜์„ธ์š”.
    2. ์ˆ˜๋„์ฝ”๋“œ
      • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ : ๊ฐ ์‹๊ฐ 1- 27๊ถŒ์˜ ์ •๋ณด
      • ์‘์ถ•ํ•˜๋Š” ๋ฐฉ๋ฒ• (ํ•จ์ˆ˜) : ๊ฐ ๋‹จํ–‰๋ณธ์˜ ํ‰์ ์„ ๋ˆ„์ ๊ฐ’์— ๋”ํ•ฉ๋‹ˆ๋‹ค.
      • ์›ํ•˜๋Š” ํ˜•ํƒœ : ์ˆซ์ž๋กœ ๋ˆ„์ ํ•ฉ๋‹ˆ๋‹ค.
      • ์‘์ถ•๋œ ๊ฒฐ๊ณผ : ๊ฐ ๋‹จํ–‰๋ณธ์˜ ํ‰์ ์˜ ํ•ฉ์„ ๋‹จํ–‰๋ณธ์˜ ๊ธธ์ด๋กœ ๋‚˜๋ˆˆ ํ‰์ ์˜ ํ‰๊ท 
    3. ๋‚˜์˜ ํ’€์ด

      1
      2
      3
      4
      5
      
       const reviewAvg = function(sum, cartoon){
         return sum+cartoon.averageScore;
       }
       let initValue=0;
       const reviewScore =cartoons.reduce(reviewAvg,initValue)/cartoons.length;
      
    4. ์ถ”๊ฐ€ ๋„์ „ - max ๊ฐ’ ๊ตฌํ•˜๊ธฐ

      1
      2
      
       const cartoonMaxScore =cartoons.reduce(
         (sum,cartoon)=> sum<cartoon.averageScore? cartoon.averageScore :sum,cartoons[0].averageScore);
      





๊ณ ์ฐจํ•จ์ˆ˜์˜ ํ•„์š”์„ฑ

๋ณต์žกํ•œ ์–ด๋–ค ๊ฒƒ์„ ์••์ถ•ํ•ด์„œ ํ•ต์‹ฌ๋งŒ ์ถ”์ถœํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์ถ”์ƒํ™”

JavaScript๋ฅผ ๋น„๋กฏํ•œ ๋งŽ์€ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด ์—ญ์‹œ, ์ถ”์ƒํ™”์˜ ๊ฒฐ๊ณผ

  • ์ถ”์ƒํ™” = ์ƒ์‚ฐ์„ฑ(productivity)์˜ ํ–ฅ์ƒ

ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์–ป์€ ์ถ”์ƒํ™”๋ฅผ, ํ•œ ๋‹จ๊ณ„ ๋” ๋†’์ธ ๊ฒƒ์ด ๊ณ ์ฐจ ํ•จ์ˆ˜

  • ํ•จ์ˆ˜ = ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„ ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค. = ๊ฐ’์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๋กœ์ง์€ ๊ฐ์ถ”์–ด์ ธ ์žˆ๋‹ค. = ๊ฐ’ ์ˆ˜์ค€์—์„œ์˜ ์ถ”์ƒํ™”
  • ๊ณ ์ฐจ ํ•จ์ˆ˜๋Š” ์ด ์ถ”์ƒํ™”์˜ ์ˆ˜์ค€์„ ์‚ฌ๊ณ ์˜ ์ถ”์ƒํ™” ์ˆ˜์ค€์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆผ
  • ๊ฐ’ ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”: ๋‹จ์ˆœํžˆ ๊ฐ’(value)์„ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ˆ˜์ค€
  • ์‚ฌ๊ณ ์˜ ์ถ”์ƒํ™”: ํ•จ์ˆ˜(์‚ฌ๊ณ ์˜ ๋ฌถ์Œ)๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ˆ˜์ค€

๋‹ค์‹œ ๋งํ•ด ๊ณ ์ฐจ ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด, ๋ณด๋‹ค ๋†’์€ ์ˆ˜์ค€(higher order)์—์„œ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Œ

  • ๊ณ ์ฐจ ํ•จ์ˆ˜ = ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ๋ฐ›๊ฑฐ๋‚˜ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. = ์‚ฌ๊ณ (ํ•จ์ˆ˜)์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๋กœ์ง์€ ๊ฐ์ถ”์–ด์ ธ ์žˆ๋‹ค. = ์‚ฌ๊ณ  ์ˆ˜์ค€์—์„œ์˜ ์ถ”์ƒํ™”




๊ณ ์ฐจํ•จ์ˆ˜ ๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

Underscore.js๋Š”ย ๋‚ด์žฅ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ ๋„ map, filter, revoke ๋“ฑ๊ณผ ๊ฐ™์ด
ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ํฐ ๋„์›€์ด ๋˜๋Š” ๋งŽ์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๊ณ  ํ•จ.
์•„๋ž˜ ๋งํฌ๋กœ ์ด๋™
[https://www.geeksforgeeks.org/underscore-js-_-each-function/?ref=lbp]

_.slice ๋‚˜, _.take, _.drop, _.last๊นŒ์ง€๋Š” ์‰ฌ์› ๋Š”๋ฐ callbackํ•จ์ˆ˜ ๊ตฌํ˜„์€ ์‰ฝ์ง€ ์•Š์•˜๋‹ค ์จ๋ณธ์  ์—†๊ธฐ๋„ ํ•˜๊ณ 

์ด์ œ ๋ฐฐ์›Œ์„œ ๊ตฌํ˜„ํ•˜๊ธฐ์—” ์‹œ๊ฐ„์ด ์กฐ๊ธˆ ๋” ์†Œ๋ชจ๋˜์—ˆ๋Š”๋ฐ ๊ทธ๋ž˜๋„ ์–ด๋–ป๊ฒŒ๋“  ๊ตฌํ˜„ํ•ด๋ณด๋ ค๊ณ  ๋…ธ๋ ฅํ•จ.

_.each

  1. each์™€ map์€ ๊ณ ์ฐจํ•จ์ˆ˜ ์ค‘์— ๊ฐ€์žฅ ๊ธฐ๋ณธ์ด ๋˜๋Š” ํ•จ์ˆ˜,

    1. map๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ each๋Š” ๋ฐ˜ํ™˜์„ ํ•˜์ง€ ์•Š๊ณ  map์€ ๋ฐ˜ํ™˜์„ ํ•œ๋‹ค๋Š” ์ฐจ์ด๊ฐ€ ์žˆ์Œ.

      1
      2
      3
      4
      5
      
      arr=[1,2,3,4,5]
      for(let i =0; i<arr.lenth;i++){
      	arr[i]=func(arr[i]); //=== map
      	func(arr[i]) //=== each
      }
      
    2. ===forEach()

  2. _.each() ๊ตฌํ˜„

    1. _.each๋Š” collection์˜ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

    2. collection(๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด)๊ณผ ํ•จ์ˆ˜ iteratee(๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…)๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„ (iteratee๋Š” ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ callback ํ•จ์ˆ˜

    3. collection์˜ ๋ฐ์ดํ„ฐ(element ๋˜๋Š” property)๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ iteratee์— ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค

    4. ๋‹ค์–‘ํ•œ ํ˜•ํƒœ์˜ callback ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•จ.

    5. iteratee ์„ค๋ช…

      1
      2
      3
      4
      5
      
      iteratee๋Š” ์ฐจ๋ก€๋Œ€๋กœ ๋ฐ์ดํ„ฐ(element ๋˜๋Š” value), ์ ‘๊ทผ์ž(index ๋˜๋Š” key), collection์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
       *  ๋ฐฐ์—ด arr์„ ์ž…๋ ฅ๋ฐ›์„ ๊ฒฝ์šฐ, iteratee(ele, idx, arr)
       *  ๊ฐ์ฒด obj๋ฅผ ์ž…๋ ฅ๋ฐ›์„ ๊ฒฝ์šฐ, iteratee(val, key, obj)
       * ์ด์ฒ˜๋Ÿผ collection์˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ iteratee์˜ ์ธ์ž๋กœ ์ž˜ ์ „๋‹ฌ๋˜์–ด์•ผ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
       * ์‹ค์ œ๋กœ ์ „๋‹ฌ๋˜๋Š” callback ํ•จ์ˆ˜๋Š” collection์˜ ๋ชจ๋“  ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
      
    6. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      _.each = function (collection, iteratee) {
          if(Array.isArray(collection)){
            for (let i = 0; i < collection.length; i++) {
              iteratee(collection[i], i, collection);
            }
          }else if(typeof collection ==='object'){
            for(let key in collection){
              iteratee(collection[key],key,collection);
            }
          }
      };
      
      1. _.each = function (collection, iteratee) { } ์ด๋ ‡๊ฒŒ ๋˜์–ด์žˆ๊ณ  ์ค‘๊ด„ํ˜ธ ๋‚ด๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ–ˆ๋Š”๋ฐ iteratee์— ๋Œ€ํ•œ ์„ค๋ช…์„ ์ฝ์–ด๋„ ์ด๊ฒŒ ๋ญ”๊ฐ€ ํ–ˆ๋Š”๋ฐ ์•Œ๊ณ  ๋ณด๋‹ˆ callbackํ•จ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ํ•จ์ˆ˜์˜€์Œ
      2. ๊ทธ ํ›„์—๋Š” ๋ฐฐ์—ด์ธ์ง€ ๊ฐ์ฒด์ธ์ง€ ๊ตฌ๋ถ„ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ–ˆ์Œ
        • ๋ฐฐ์—ด๊ณผ ๊ฐ์ฒด๋ฅผ ๊ตฌ๋ถ„ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ typeof ์‚ฌ์šฉํ•˜๋ฉด ๋‘˜๋‹ค object๋กœ ๋‚˜์˜ค๊ธฐ ๋•Œ๋ฌธ์—
        • ๋ฐฐ์—ด์ธ์ง€ ๋จผ์ € ๊ฑฐ๋ฅธ ํ›„ ๋ฐฐ์—ด์ด ์•„๋‹ˆ๊ณ  typeof๊ฐ€ object์ด๋ฉด ๊ฐ์ฒด๋กœ ๋ถ„๋ฆฌ.
      3. ์ˆœํšŒ ํ•œ ํ›„ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๊ฐ์ฒด(๋ฐฐ์—ด)์˜ ์š”์†Œ์™€ key(index) ๊ทธ๋ฆฌ๊ณ  ๊ฐ์ฒด๋ฅผ ๋งค๊ฐœ์ธ์ž๋กœ ๋„ฃ์–ด์คŒ.

_.filter

  1. _.filter() ๊ตฌํ˜„

    1. _.filter๋Š” test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.

    2. test(element)์˜ ๊ฒฐ๊ณผ(return ๊ฐ’)๊ฐ€ truthy์ผ ๊ฒฝ์šฐ, ํ†ต๊ณผ test ํ•จ์ˆ˜๋Š” ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณต ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

    3. ์•ž์„œ ๋งŒ๋“  _.each ํ™œ์šฉํ•˜๊ธฐ

    4. _.filter = function (arr, test) { } , 2๋ฒˆ์งธ ์ธ์ž๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์— ํ•ด๋‹น.

    5. ๋‚ด๊ฐ€ ๊ตฌํ˜„ ์ฝ”๋“œ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      _.filter = function (arr, test) {
        let result = []; 
        _.each(arr, function(element) {
          if (test(element)) {
          result.push(element);
        }
      });
            
       return result;
            
      };
      
      1. _.each ๊ตฌํ˜„๋„ ์–ด๋ ค์› ๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•ด์•ผํ•˜๋‚˜ ๋ณด๋‹ค๊ฐ€ ์œ„์— _.indexOf ๋ฅผ _.each๋กœ ํ™œ์šฉํ•œ ์˜ˆ์ œ๊ฐ€ ์žˆ์–ด์„œ ๋ณด๊ณ  ๋น„์Šทํ•˜๊ฒŒ ํ•ด๋ด„.

      2. _.filter๋กœ ๋งค๊ฐœ์ธ์ž(test)๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ๋“ค์–ด์˜ค๋Š”๋ฐ ์ด ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ true์ด๋ฉด ํ•ด๋‹น ์š”์†Œ๋ฅผ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฆฌํ„ด ํ•˜๋Š” ๋ฐฉ์‹.

      3. _.each๋กœ ๊ตฌํ˜„ํ•˜๊ธฐ ์–ด๋ ค์šฐ๋ฉด for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ณ  ๋ฆฌํŒฉํ† ๋ง ํ•ด๋ณด๊ธฐ

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        
        _.filter = function (arr, test) {
                 	
        	let result = [];
                 	
        	for(let i =0; i<arr.length ; i++){
        			arr[i] = element;
        				if(test(element)){
        				result.push(element);
        				}
        			}
        	return result;
        }
        
        • ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ _.each๋กœ ๋ณ€๊ฒฝํ•ด๋ณด๋ฉด ๊ณ ์ฐจํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋” ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์›€.
        • _.each๋Š” ๊ฐ์ฒด์˜ ๊ฐ ์š”์†Œ๋ฅผ ๊บผ๋‚ด์„œ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋„ฃ์–ด์ฃผ๋‹ˆ๊นŒ
        • for๋ฌธ์œผ๋กœ ๋ถ€ํ„ฐ 2์ค„์€ _.each๋กœ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์Œ.
    6. _.reject ๊ตฌํ˜„๋„ ์‹ค์Šต์— ์žˆ์—ˆ๋Š”๋ฐ filter์™€ ์ •๋ฐ˜๋Œ€๋กœ test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜์ง€ ์•Š๋Š” ์š”์†Œ๋ฅผ ๋‹ด๋Š” ๊ฒƒ์ธ๋ฐ if์ ˆ๋งŒ ๋ถ€์ •์—ฐ์‚ฐ์ž ์‚ฌ์šฉํ•˜๋ฉด ๋จ.

_.uniq

  1. _.uniq๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•จ.

    1. _.each, _.indexOf ํ™œ์šฉํ•˜๊ธฐ

    2. ์ค‘๋ณต์—ฌ๋ถ€๋Š” ์—„๊ฒฉํ•œ ๋™์น˜์—ฐ์‚ฐ.

    3. ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” ๋ชจ๋‘ primitive value

    4. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      
      _.uniq = function (arr) {
            
      let result=[];
      	_.each(arr, function(element){
      	if(_.indexOf(result,element)===-1){
      				result.push(element);
      		}
      	});
            	
      	return result;
      }
      
      1. ๊ณ„์† ํ…Œ์ŠคํŠธ ํ†ต๊ณผ๊ฐ€ ์•ˆ๋˜์„œ ์™œ ์•ˆ๋˜๋Š”์ง€ ์ด ์ฝ”๋“œ๊ฐ€ ๋งž๋Š”๊ฒƒ ๊ฐ™์€๋ฐ ์ด์ƒํ–ˆ๋‹ค.
      2. ์ค‘๊ด„ํ˜ธ ์ž˜๋ชป ์ ์—ˆ๋Š”์ง€ ํ•œ์ฐธ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ ํ’€๊ณ  ๋‹ค์‹œ ๋ด๋„ ๋ชฐ๋ž๋Š”๋ฐ ํ•œ์ฐธ ๋ณด๋‹ค๊ฐ€ _.indexOf์— . dot์ด ์—†์—ˆ์Œโ€ฆ!

_.map()

  1. react์—์„œ๋Š” map๋งŒ ์‚ฌ์šฉํ•ด์„œ map์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ ์ค‘์š”

  2. _.map ๊ตฌํ˜„

    1. ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋‹ค๋ฅธ ๊ฒƒ(iteratee์˜ ๊ฒฐ๊ณผ)์œผ๋กœ ๋งคํ•‘(mapping)

    2. iteratee(๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…)๋ฅผ ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ์ ์šฉ(apply)ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ด

    3. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

      1
      2
      3
      4
      5
      6
      7
      
      _.map = function (arr, iteratee) {
      	let result =[];
      	_.each(arr,function(element){
      		result.push(iteratee(element)
      	});
      	return result;
      }
      

_.pluck()

  1. ๊ฐ์ฒด ๋˜๋Š” ๋ฐฐ์—ด์„ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด๊ณผ ๊ฐ ์š”์†Œ์—์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” key ๋˜๋Š” index๋ฅผ ์ž…๋ ฅ๋ฐ›์•„

  2. ๊ฐ ์š”์†Œ์˜ ํ•ด๋‹น ๊ฐ’ ๋˜๋Š” ์š”์†Œ๋งŒ์„ ์ถ”์ถœํ•˜์—ฌ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ €์žฅํ•˜๊ณ ,

  3. ์ตœ์ข…์ ์œผ๋กœ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ด

  4. ์˜ˆ๋ฅผ ๋“ค์–ด, ๊ฐ ๊ฐœ์ธ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ํ†ตํ•ด์„œ, ๋ชจ๋“  ๊ฐœ์ธ์˜ ๋‚˜์ด๋งŒ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ณ„๋„์˜ ๋ฐฐ์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

  5. ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌํ„ด๋˜๋Š” ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ธธ์ด์™€ ๊ฐ™์•„์•ผ

  6. ๋”ฐ๋ผ์„œ ์ฐพ๊ณ ์ž ํ•˜๋Š” key ๋˜๋Š” index๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์€ ์š”์†Œ์˜ ๊ฒฝ์šฐํ•จ, ์ถ”์ถœ ๊ฒฐ๊ณผ๋Š” undefined ์ž…๋‹ˆ๋‹ค.

  7. _.each๋ฅผ ํ™œ์šฉํ•˜์—ฌ _.pluck ๊ตฌํ˜„ ์˜ˆ์ œ

    1
    2
    3
    4
    5
    6
    7
    8
    
      //_.pluck์„ _.each๋ฅผ ์‚ฌ์šฉํ•ด ๊ตฌํ˜„ํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
      _.pluck = function (arr, keyOrIdx) {
      let result = [];
      _.each(arr, function (item) {
        result.push(item[keyOrIdx]);
      });
      return result;
      }
    
  8. -.map์œผ๋กœ ๊ตฌํ˜„ ํ•ด๋ณด๊ธฐ.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
     _.pluck = function (arr, keyOrIdx) {
      let newArr=[];
      if(keyOrIdx===undefined){
          return undefined;
        }
     _.map(arr,function(item){
          newArr.push(item[keyOrIdx]);
     });
        return newArr;
    };
    

_.reduce()

  1. ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์— iteratee ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ณ„์†ํ•ด์„œ ๋ˆ„์ (accumulate), ์ตœ์ข…์ ์œผ๋กœ ๋ˆ„์ ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ด

    1. ๋ฐฐ์—ด [1, 2, 3, 4]๋ฅผ ์ „๋ถ€ ๋”ํ•ด์„œ 10์ด๋ผ๋Š” ํ•˜๋‚˜์˜ ๊ฐ’์„ ๋ฆฌํ„ด
    2. ๊ฐ ์š”์†Œ๊ฐ€ ์ฒ˜๋ฆฌ๋  ๋•Œ๋งˆ๋‹ค ๋ˆ„์ ๋˜๋Š” ๊ฐ’์€ ์ฐจ๋ก€๋Œ€๋กœ 1, 1+2, 1+2+3, 1+2+3+4
  2. ๋‹ค์ˆ˜์˜ ์ •๋ณด๊ฐ€ ํ•˜๋‚˜์˜ ๊ฐ’์œผ๋กœ ์ถ•์†Œ(์‘์ถ•, ํ™˜์›, reduction)๋˜๊ธฐ ๋•Œ๋ฌธ์— reduce๋ผ๋Š” ์ด๋ฆ„์ด ๋ถ™๊ฒŒ ๋œ ๊ฒƒ

  3. _.reduce(arr, iteratee, initVal)

    1. arr : ๋ฐฐ์—ด
    2. iteratee : ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณตํ•  ์ž‘์—…
    3. initVal : ์ดˆ๊ธฐ ๊ฐ’
  4. iteratee(acc, ele, idx, arr)

    1. acc : ์ด์ „ ์š”์†Œ๊นŒ์ง€์˜ ๋ฐ˜๋ณต ์ž‘์—…์˜ ๊ฒฐ๊ณผ๋กœ ๋ˆ„์ ๋œ ๊ฐ’
    2. ele : ๋ฐ˜๋ณต ์ž‘์—…์„ ์ˆ˜ํ–‰ํ• (์•„์ง ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€) ํ˜„์žฌ์˜ ์š”์†Œ
    3. ์„ธ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ดˆ๊ธฐ ๊ฐ’์ด ์ „๋‹ฌ๋˜๋Š” ๊ฒฝ์šฐ, ๊ทธ ๊ฐ’์„ ๋ˆ„์  ๊ฐ’์˜ ๊ธฐ์ดˆ(acc)๋กœ ํ•˜์—ฌ ๋ฐฐ์—ด์˜ โ€˜์ฒซ ๋ฒˆ์งธโ€™ ์š”์†Œ๋ถ€ํ„ฐ ๋ฐ˜๋ณต ์ž‘์—…์ด ์ˆ˜ํ–‰
    4. ์ดˆ๊ธฐ ๊ฐ’์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ๋ˆ„์  ๊ฐ’์˜ ์ถœ๋ฐœ๋กœ ํ•˜์—ฌ ๋ฐฐ์—ด์˜ โ€˜๋‘ ๋ฒˆ์งธโ€™ ์š”์†Œ๋ถ€ํ„ฐ ๋ฐ˜๋ณต ์ž‘์—…์ด ์ˆ˜ํ–‰
  5. ์˜ˆ์ œ ์ฐธ๊ณ 

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
     const numbers = [1,2,3];
     const sum = _.reduce(numbers, function(total, number){
       return total + number;
     }); // ์ดˆ๊ธฐ ๊ฐ’์ด ์ฃผ์–ด์ง€์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ, ์ดˆ๊ธฐ ๊ฐ’์€ ๋ฐฐ์—ด์˜ ์ฒซ ์š”์†Œ์ธ 1์ž…๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ๋ฐ˜๋ณต ์ž‘์—…์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
         // 1 + 2 = 3; (์ฒซ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ˆ„์ ๋˜์–ด ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.)
         // 3 + 3 = 6; (๋งˆ์ง€๋ง‰ ์ž‘์—…์ด๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ 6์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค.)
       
     const identity = _.reduce([3, 5], function(total, number){
       return total + number * number;
     }, 2); // ์ดˆ๊ธฐ ๊ฐ’์ด 2๋กœ ์ฃผ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๋ถ€ํ„ฐ ๋ฐ˜๋ณต ์ž‘์—…์ด ์‹œ์ž‘๋ฉ๋‹ˆ๋‹ค.
            // 2 + 3 * 3 = 11; (์ฒซ ์ž‘์—…์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋ˆ„์ ๋˜์–ด ๋‹ค์Œ ์ž‘์—…์œผ๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.)
            // 11 + 5 * 5 = 36; (๋งˆ์ง€๋ง‰ ์ž‘์—…์ด๋ฏ€๋กœ ์ตœ์ข…์ ์œผ๋กœ 36์ด ๋ฆฌํ„ด๋ฉ๋‹ˆ๋‹ค.)
    
  6. ๋‚ด๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    _.reduce = function (arr, iteratee, initVal) {
      // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
      let acc=initVal;
         
      _.each(arr,function(element,idx,collection){
       if(acc===undefined){
        acc = arr[0];
       }else{
        acc =iteratee(acc,element,idx,collection);
       }
       
    })
      return acc;
    };
    

๋งŽ์ด ์–ด๋ ค์› ์ง€๋งŒ ๊ทธ๋ž˜๋„ ๋‚ด์žฅ๊ฐ์ฒด๊ฐ€ ์–ด๋–ค์‹์œผ๋กœ ๊ตฌํ˜„๋˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์‹œ๊ฐ„์ด์—ˆ๋‹คโ€ฆ ์•„์ง ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ดํ•ด๊ฐ€ ๋ถ€์กฑํ•ด์„œ each๋ฌธ ๋ถ€ํ„ฐ๋Š” ์กฐ๊ธˆ ๋‹นํ™ฉํ–ˆ๋Š”๋ฐ ์ œ์•ฝ์กฐ๊ฑด์ด ๋งŽ์œผ๋ฉด ์ผ๋‹จ ์ œ์•ฝ์กฐ๊ฑด ๋ฌด์‹œํ•˜๊ณ  ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ•œ ๋‹ค์Œ ๋ฆฌํŒฉํ† ๋ง์œผ๋กœ ์ˆ˜์ •ํ•ด๋‚˜๊ฐ€๋ฉด ๋˜๋‹ˆ๊นŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ฝ”๋“œ๋ฅผ ์ž˜ ์งค ์ƒ๊ฐ์„ ํ•˜์ง€๋ง๊ณ  ๋ฆฌํŒฉํ† ๋ง ํ•  ์ƒ๊ฐ์„ ํ•ด์•ผํ•จ. ๋งค๋ฒˆ ๊ฐ•์‚ฌ๋‹˜์ด ํ•˜์‹  ๋ง์”€์ธ๋ฐ ํ…Œ์ŠคํŠธ๋ฅผ ๋นจ๋ฆฌ ํ†ต๊ณผํ•ด์•ผ๋œ๋‹ค๋Š” ์ƒ๊ฐ๋•Œ๋ฌธ์— ๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€๋ชปํ–ˆ์Œ. ๊ทธ๋ž˜์„œ ์ „๋ถ€ for๋ฌธ์œผ๋กœ ๊ตฌํ˜„ํ•˜๊ณ  ์ฝœ๋ฐฑ์„ ์ดํ•ดํ•œ ๋‹ค์Œ, ๋‹ค์‹œ ์‹œ๋„ํ•ด ๋ณผ ์˜ˆ์ •

javascript ์นดํ…Œ๊ณ ๋ฆฌ ๋‚ด ๋‹ค๋ฅธ ๊ธ€ ๋ณด๋Ÿฌ๊ฐ€๊ธฐ

Leave a comment