ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JS] chapter14. ๋‚ด์žฅ๊ณ ์ฐจํ•จ์ˆ˜
    codeStates front-end/Java Script 2023. 1. 12. 13:59
    ๋ฐ˜์‘ํ˜•

     

     

     

     

     

     

     

     

     

     

     

     

     

    ๐Ÿ“Œ ๋‚ด์žฅ ๊ณ ์ฐจ ํ•จ์ˆ˜

     

     

    JS์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ๋œ ๊ณ ์ฐจ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค

    ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ๋“ค ์ค‘ ์ผ๋ถ€๊ฐ€ ๋Œ€ํ‘œ์ ์ธ ๊ณ ์ฐจ ํ•จ์ˆ˜

     

     

    1. filter

     

    ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์ด๋ฉฐ, ๋ชจ๋“  ๋ฐฐ์—ด์˜ ์š”์†Œ ์ค‘์—์„œ ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ์š”์†Œ๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋ฉ”์„œ๋“œ

     

    filter ๊ณผ์ •

    • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€
    • ํŠน์ • ๋…ผ๋ฆฌ(ํ•จ์ˆ˜)์— ๋”ฐ๋ฅด๋ฉด, ์‚ฌ์‹ค(true)์ผ ๋•Œ
    • ๋”ฐ๋กœ ๋ถ„๋ฅ˜(filter).

     

     

    // ์•„๋ž˜ ์ฝ”๋“œ์—์„œ '์ง์ˆ˜'์™€ '๊ธธ์ด 5 ์ดํ•˜'๋Š” ๋ฌธ๋ฒ• ์˜ค๋ฅ˜(syntax error)์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
    // ์˜๋ฏธ๋งŒ ์ดํ•ดํ•ด๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    let arr = [1, 2, 3, 4];
    let output = arr.filter(์ง์ˆ˜);
    console.log(output); // ->> [2, 4]
    
    arr = ['hello', 'code', 'states', 'happy', 'hacking'];
    output = arr.filter(๊ธธ์ด 5 ์ดํ•˜)
    console.log(output); // ->> ['hello', 'code', 'happy']

     

    ์—ฌ๊ธฐ์„œ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๊ธฐ์ค€์ด ๋˜๋Š” ํŠน์ • ์กฐ๊ฑด์€ filter ๋ฉ”์„œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ, ์ด๋•Œ ์ „๋‹ฌ๋˜๋Š” ์กฐ๊ฑด์€ ํ•จ์ˆ˜์˜ ํ˜•ํƒœ

    filter ๋ฉ”์„œ๋“œ๋Š”, ๊ฑธ๋Ÿฌ๋‚ด๊ธฐ ์œ„ํ•œ ์กฐ๊ฑด์„ ๋ช…์‹œํ•œ ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๊ณ ์ฐจ ํ•จ์ˆ˜์ด๋‹ค

     

     

    // ์•„๋ž˜ ์ฝ”๋“œ๋Š” ์ •ํ™•ํ•œ ํ‘œํ˜„ ๋ฐฉ์‹์€ ์•„๋‹™๋‹ˆ๋‹ค.
    // ์˜๋ฏธ๋งŒ ์ดํ•ดํ•ด๋„ ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.
    
    let arr = [1, 2, 3];
    // ๋ฐฐ์—ด์˜ filter ๋ฉ”์„œ๋“œ๋Š” ํ•จ์ˆ˜๋ฅผ ์ „๋‹ฌ์ธ์ž๋กœ ๋ฐ›๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
    // arr.filter๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋‚ด๋ถ€์ ์œผ๋กœ arr์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.
    arr.filter = function (arr, func) {
      const newArr = [];
      for (let i = 0; i < arr.length; i++) {
        // filter์— ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” arr์˜ ๊ฐ ์š”์†Œ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.
        // ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ true๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.
        if (func(arr[i]) === true) {
          newArr.push(this[i]);
        }
      }
      // ์ฝœ๋ฐฑ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๊ฐ€ true์ธ ์š”์†Œ๋“ค๋งŒ ์ €์žฅ๋œ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
      return newArr;
    };
    
    /*
     * filter ๋ฉ”์„œ๋“œ์˜ ๋ณด๋‹ค ์ •ํ™•ํ•œ ์ •์˜๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋‹ค์Œ ์œ ๋‹›์—์„œ ํ”„๋กœํ† ํƒ€์ž…๊ณผ this์— ๋Œ€ํ•œ ํ•™์Šต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
     * Array.prototype.filter = function(func) {
     *   const arr = this;
     *   const newArr = []
     *   for(let i = 0; i < arr.length; i++) {
     *     if (func(arr[i]) === true) {
     *       newArr.push(this[i])
     *     }
     *   }
     *   return newArr;
     * }
     */

     

    filter ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์ฝœ๋ฐฑ ํ•จ์ˆ˜์— ๋‹ค์‹œ ์ „๋‹ฌ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ „๋‹ฌ๋ฐ›์€ ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ

    ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ์ฝœ๋ฐฑ ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ฐธ(true) ๋˜๋Š” ๊ฑฐ์ง“(false)์„ ๋ฆฌํ„ด

     

     

    // ํ•จ์ˆ˜ ํ‘œํ˜„์‹
    const isEven = function (num) {
      return num % 2 === 0;
    };
    
    let arr = [1, 2, 3, 4];
    // let output = arr.filter(์ง์ˆ˜);
    // '์ง์ˆ˜'๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์กฐ๊ฑด์œผ๋กœ์„œ filter ๋ฉ”์„œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    let output = arr.filter(isEven);
    console.log(output); // ->> [2, 4]
    
    const isLteFive = function (str) {
      // Lte = less then equal
      return str.length <= 5;
    };
    
    arr = ['hello', 'code', 'states', 'happy', 'hacking'];
    // output = arr.filter(๊ธธ์ด 5 ์ดํ•˜)
    // '๊ธธ์ด 5 ์ดํ•˜'๋ฅผ ํŒ๋ณ„ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์กฐ๊ฑด์œผ๋กœ์„œ filter ๋ฉ”์„œ๋“œ์˜ ์ „๋‹ฌ์ธ์ž๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
    let output = arr.filter(isLteFive);
    console.log(output); // ->> ['hello', 'code', 'happy']

     

     

    2. map

     

    • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๊ฐ€
    • ํŠน์ • ๋…ผ๋ฆฌ(ํ•จ์ˆ˜)์— ์˜ํ•ด
    • ๋‹ค๋ฅธ ์š”์†Œ๋กœ ์ง€์ •(map) 

     

    const double = function (num) {
      return num * 2;
    };
    
    let arr = [1, 2, 3, 4, 5, 6, 7];
    let output = arr.map(double);
    console.log(output); // [2, 4, 6, 8, 10, 12, 14]

     

     

    3. reduce

     

    • ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ
    • ํŠน์ • ๋ฐฉ๋ฒ•(ํ•จ์ˆ˜)์— ๋”ฐ๋ผ
    • ์›ํ•˜๋Š” ํ•˜๋‚˜์˜ ํ˜•ํƒœ๋กœ
    • ์‘์ถ• (reduction)

     

    const addAccCur = function (acc, cur) {
      return acc + cur;
    };
    
    let arr = [1, 2, 3, 4, 5, 6, 7];
    let output = arr.reduce(addAccCur);
    console.log(output); // 28

     

    ์ดˆ๊ธฐ๊ฐ’์„ ์„ ์–ธ ํ–ˆ์„ ๋•Œ

     

    const addAccCur = function (acc, cur) {
      return acc + cur;
    };
    const initialValue = 1;
    
    let arr = [1, 2, 3, 4, 5, 6, 7];
    let output = arr.reduce(addAccCur, initialValue);
    console.log(output); // 29

     

     

     

     

     

    ๐Ÿ”ฆ ๊ณ ์ฐจํ•จ์ˆ˜์˜ ์ค‘์š”์„ฑ

     

    ์ถ”์ƒํ™”(abstraction)

     

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

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

    ํ•จ์ˆ˜ = ๊ฐ’์„ ์ „๋‹ฌ๋ฐ›์•„ ๊ฐ’์„ ๋ฆฌํ„ด = ๊ฐ’์— ๋Œ€ํ•œ ๋ณต์žกํ•œ ๋กœ์ง์€ ๊ฐ์ถ”์–ด์ ธ ์žˆ์Œ = ์ถ”์ƒํ™”

     

    getAverage ํ•จ์ˆ˜๋Š” ๋ฐฐ์—ด์„ ์ธ์ž๋กœ ๋ฐ›์•„, ํ‰๊ท ๊ฐ’์„ ๋ฆฌํ„ด

    function getAverage(data) {
      let sum = 0;
      for (let i = 0; i < data.length; i++) {
        sum = sum + data[i];
      }
      return sum / data.length;
    }
    
    let output = getAverage([1, 2, 3]);
    console.log(output); // --> 2
    
    output = getAverage([4, 2, 3, 6, 5, 4]);
    console.log(output); // --> 4

     

     

    ์‚ฌ๊ณ  ์ˆ˜์ค€์˜ ์ถ”์ƒํ™”

     

    const data = [
      {
        gender: 'male',
        age: 24,
      },
      {
        gender: 'male',
        age: 25,
      },
      {
        gender: 'female',
        age: 27,
      },
      {
        gender: 'female',
        age: 22,
      },
      {
        gender: 'male',
        age: 29,
      },
    ];

     

    -> ๋‚จ์„ฑ๋“ค์˜ ํ‰๊ท  ๋‚˜์ด๋Š”?

     

     

    function getAverageAgeOfMaleAtOnce(data) {
      const onlyMales = data.filter(function (d) {
        // data.filter๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ ,
        // ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ true์ธ ์š”์†Œ๋งŒ์„ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        return d.gender === 'male';
      });
    
      const numOfMales = onlyMales.length;
    
      const onlyMaleAges = onlyMales.map(function (d) {
        // onlyMales.map๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ ,
        // ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ์š”์†Œ๋กœ ๊ฐ–๋Š” ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        return d.age;
      });
    
      const sumOfAges = onlyMaleAges.reduce(function (acc, cur) {
        // onlyMaleAges.reduce๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์— ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•˜๊ณ ,
        // ๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์€ ์ดˆ๊ธฐ๊ฐ’(0)์— ๋ˆ„์ ํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        return acc + cur;
      }, 0);
    
      return sumOfAges / numOfMales;
    }

     

    -> ๋‚จ์„ฑ์˜ ์ตœ์—ฐ์†Œ ๋‚˜์ด/์ตœ์—ฐ์žฅ ๋‚˜์ด? ๋“ฑ๋“ฑ๋“ฑ

     

    ์ด๋•Œ ์ถ”์ƒํ™”-> ๊ณ ์ฐจ ํ•จ์ˆ˜ ๊ฐ๊ฐ์˜ ์ž‘์—…(filter, map, reduce) ํ•จ์ˆ˜ ๋ถ„๋ฆฌ ํ›„ compose์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜

     

     

    function getOnlyMales(data) {
      return data.filter(function (d) {
        return d.gender === 'male';
      });
    }
    
    function getOnlyAges(data) {
      return data.map(function (d) {
        return d.age;
      });
    }
    
    function getAverage(data) {
      const sum = data.reduce(function (acc, cur) {
        return acc + cur;
      }, 0);
      return sum / data.length;
    }
    
    function compose(...funcArgs) {
      // compose๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•จ์ˆ˜๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ๊ณ ์ฐจ ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
      // compose๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜(์ต๋ช… ํ•จ์ˆ˜)๋Š” ์ž„์˜์˜ ํƒ€์ž…์˜ data๋ฅผ ์ž…๋ ฅ๋ฐ›์•„,
      return function (data) {
        // funcArgs์˜ ์š”์†Œ์ธ ํ•จ์ˆ˜๋“ค์„ ์ฐจ๋ก€๋Œ€๋กœ ์ ์šฉ(apply)์‹œํ‚จ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
        let result = data;
        for (let i = 0; i < funcArgs.length; i++) {
          result = funcArgs[i](result);
        }
        return result;
      };
    }
    
    // compose๋ฅผ ํ†ตํ•ด ํ•จ์ˆ˜๋“ค์ด ์ˆœ์„œ๋Œ€๋กœ ์ ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์ด ์ง๊ด€์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.
    // ๊ฐ๊ฐ์˜ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์„ ์œ„ํ•ด ์žฌ์‚ฌ์šฉ(reuse) ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    const getAverageAgeOfMale = compose(
      getOnlyMales, // ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
      getOnlyAges, // ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
      getAverage // ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„ `number` ํƒ€์ž…์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
    );
    
    const result = getAverageAgeOfMale(data);
    console.log(result); // --> 26

     

     

     

     

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.