Jieunny์˜ ๋ธ”๋กœ๊ทธ

S2) Unit3. [์‹ค์Šต] Underbar ๋ณธ๋ฌธ

CodeStates/Training

S2) Unit3. [์‹ค์Šต] Underbar

Jieunny 2023. 1. 17. 18:00

๐Ÿ“ฃ  js ๋ฉ”์„œ๋“ค์„ ์ง์ ‘ ๊ตฌํ˜„ํ•ด๋ณด์ž

โžฐ ๊ตฌํ˜„ํ•˜๋ฉด์„œ ํ—ท๊ฐˆ๋ ธ๊ฑฐ๋‚˜ ํ—ค๋งธ๋˜ ๋ฉ”์„œ๋“œ๋“ค๋งŒ ์ •๋ฆฌ

 

 

1๏ธโƒฃ reduce

โžฐ ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉฐ ๊ฐ ์š”์†Œ์— iteratee ํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•œ๋‹ค.

โžฐ ๊ทธ ๊ฒฐ๊ณผ๊ฐ’์„ ๊ณ„์† ๋ˆ„์ ํ•œ๋‹ค.

โžฐ ์ตœ์ข…์ ์œผ๋กœ ๋ˆ„์ ๋œ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค.

โžฐ iteratee(acc, ele, idx, arr) -> ์ฐจ๋ก€๋Œ€๋กœ ๋ˆ„์ ๊ฐ’, ๋ฐ์ดํ„ฐ, ์ ‘๊ทผ์ž, collection

_.reduce = function (arr, iteratee, initVal) {
  // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  let result = initVal;

  _.each(arr, function(ele, idx, arr){
    if(result === undefined){
      result = arr[0];
    }
    else {
      result = iteratee(result, ele, idx, arr);
    }
  });

  return result;
};
โžฐ result : ๋ˆ„์ ํ•  ๋ณ€์ˆ˜
โžฐ each๋กœ ๋ฐฐ์—ด์— ์žˆ๋Š” ์š”์†Œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋ˆ๋‹ค.
โžฐ ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ initVal์ด ์ฃผ์–ด์ง€์ง€ ์•Š์•˜๋‹ค๋ฉด undefined์ด๋ฏ€๋กœ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋ฅผ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ค€๋‹ค.
โžฐ ์ดˆ๊ธฐ๊ฐ’์ด ์žˆ๋‹ค๋ฉด, ๊ทธ ์ดˆ๊ธฐ๊ฐ’์„ iteratee ๋ˆ„์ ๊ฐ’์œผ๋กœ ์ค€๋‹ค.
โžฐ iteratee ์— ๊ณ„์† result๋ฅผ ์ฃผ๊ณ , ๊ทธ ๊ฐ’์„ ๋‹ค์‹œ result์— ํ• ๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ’์ด ๊ณ„์† ๋ˆ„์ ๋œ๋‹ค.

 

2๏ธโƒฃ once

โžฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

โžฐ once๊ฐ€ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด๋„ ์ฝœ๋ฐฑํ•จ์ˆ˜๋Š” ํ•œ ๋ฒˆ ์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.

_.once = function (func) {
  // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  let isCalled = false;
  let result;

  return function () {
    // TIP: arguments ํ‚ค์›Œ๋“œ ํ˜น์€, spread operator๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
    if(isCalled === false){
      result = func(...arguments);	//arguments๋Š” ์ฝœ๋ฐฑํ•จ์ˆ˜์˜ ์ธ์ž
      isCalled = true;
    }
    return result;
  };
};
โžฐ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด isCalled ๋ฅผ true๋กœ ๋ฐ”๊ฟ”์„œ ๋” ์ด์ƒ ํ˜ธ์ถœ๋˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค.

 

3๏ธโƒฃ defaults

โžฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฐ์ฒด๋ฅผ ์ž…๋ ฅ๋ฐ›์•„, ์ˆœ์„œ๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ๊ฒฐํ•ฉํ•œ๋‹ค.

โžฐ ์ฒซ๋ฒˆ์งธ ๊ฐ์ฒด๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ด๋ฏธ ์žˆ๋Š” ์†์„ฑ์€ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋Š”๋‹ค.

โžฐ ์ตœ์ข…์ ์œผ๋กœ ์†์„ฑ์ด ์ถ”๊ฐ€ ๋œ ์ฒซ๋ฒˆ์งธ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

_.defaults = function (obj, ...rest) {
  // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  _.each(rest, function(obj2){
    for(let key in obj2){
      if(obj.hasOwnProperty(key) === false){
        obj[key] = obj2[key];
      }
    }
  });

  return obj;
};
โžฐ ๊ฐ์ฒด๊ฐ€ ๋ช‡๊ฐœ ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๋‹ˆ spread๋กœ ์ธ์ž๋ฅผ ๋ฐ›์•„์˜จ๋‹ค.
โžฐ ๋“ค์–ด์˜จ ๊ฐ์ฒด๋ฅผ each๋กœ ํ•˜๋‚˜์”ฉ ๋Œ์•„์ฃผ๊ณ , ๊ฐ ๊ฐ์ฒด์˜ key๋ฅผ for๋ฌธ์œผ๋กœ ๋Œ์•„์ค€๋‹ค.
โžฐ hasOwnProperty(key) ํ•จ์ˆ˜๋Š” ๊ฐ์ฒด๊ฐ€ key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.
โžฐ ๋งŒ์•ฝ obj2์— ์žˆ๋Š” key๊ฐ€ obj์—๋Š” ์—†๋‹ค๋ฉด ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

 

4๏ธโƒฃ zip

โžฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฐฐ์—ด์„ ์ž…๋ ฅ๋ฐ›์•„, ๊ฐ™์€ index์˜ ์š”์†Œ๋“ค์„ ๋ฌถ์–ด ๋ฐฐ์—ด๋กœ ๋งŒ๋“ ๋‹ค.

โžฐ ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌํ„ด๋˜๋Š” ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ์˜ ๊ธธ์ด๋Š” ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฐ์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๋ฐฐ์—ด์˜ ๊ธธ์ด๋กœ ํ†ต์ผํ•œ๋‹ค.

_.zip = function (...rest) {
  // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  let result = [] ;
  let maxLength = 0;

  _.each(rest, function(arr){
    if(arr.length > maxLength){
      maxLength = arr.length;
    }
  });

  for(let i=0; i<maxLength; i++){
    let addArr = [];
    _.each(rest, function(arr){
      if(arr[i] === undefined){
        addArr.push(undefined);
        }
      else {
        addArr.push(arr[i]);
      }
    });
    result.push(addArr);
  }
  return result;
};
โžฐ ๊ฐ index ๊ฐ’์„ ๋ฌถ์€ ์ผ์ฐจ์› ๋ฐฐ์—ด์„ ๋‹ค์‹œ ๋‹ค๋ฅธ ๋ฐฐ์—ด์— ๋„ฃ์–ด์ฃผ๋Š” ํ˜•์‹์œผ๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.
โžฐ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜จ ๋ฐฐ์—ด ์ค‘ ๊ฐ€์žฅ ๊ธด ๊ธธ์ด๋ฅผ maxLength์— ๋„ฃ์–ด์ฃผ๊ณ , for๋ฌธ์„ maxLength๊นŒ์ง€ ์ˆœํšŒํ•œ๋‹ค.
โžฐ ์ž…๋ ฅ์œผ๋กœ ๋“ค์–ด์˜จ ๋ฐฐ์—ด์„ each๋กœ ํ•˜๋‚˜์”ฉ ์ˆœํšŒํ•œ๋‹ค.
โžฐ  ๋งŒ์•ฝ ๊ธธ์ด๊ฐ€ ์ž‘์•„์„œ undefined์ด๋ผ๋ฉด ์ถ”๊ฐ€ํ•  ๋ฐฐ์—ด์—๋„ undefined๋ฅผ ๋„ฃ์–ด์ค€๋‹ค.
โžฐ undefined์ด ์•„๋‹ˆ๋ผ๋ฉด ๊ทธ ๊ฐ’์„ ์ถ”๊ฐ€ํ•  ๋ฐฐ์—ด์— ๋„ฃ์–ด์ค€๋‹ค.
โžฐ for๋ฌธ์ด ๋๋‚  ๋•Œ๋งˆ๋‹ค addArr์„ result์— ๋„ฃ์–ด์ฃผ๊ณ , addArr์€ ๋‹ค์‹œ ์ดˆ๊ธฐํ™”ํ•ด์ค€๋‹ค.

 

5๏ธโƒฃ sortBy

โžฐ ๊ฐ ์š”์†Œ์— ํ•จ์ˆ˜ transform์„ ์ ์šฉํ•˜์—ฌ ์–ป์€ ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

โžฐ transform์ด ์ฃผ์–ด์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ ๋ฐฐ์—ด ์š”์†Œ์˜ ๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

โžฐ order๊ฐ€ ์ฃผ์–ด์ง€์ง€ ์•Š๊ฑฐ๋‚˜ 1์ธ ๊ฒฝ์šฐ ์˜ค๋ฆ„์ฐจ์ˆœ, -1์ธ ๊ฒฝ์šฐ ๋‚ด๋ฆผ์ฐจ์ˆœ์œผ๋กœ ์ •๋ ฌํ•œ๋‹ค.

_.sortBy = function (arr, transform, order) {
  if(transform === undefined){
    transform = _.identity;
  } 
  if(order === undefined){
    order = 1;
  }

  arr = [...arr];

  if(typeof arr[0] === 'string'){
    if(transform !== _.identity){
      arr.sort(function(a, b){
        if(order === 1){
          return transform(a) - transform(b);
        }
        else if(order === -1){
          return transform(b) - transform(a);
        }
      });
    }
    else{
      if(order === 1){
        arr = arr.sort();
      }
      else if(order === -1){
        arr = arr.sort().reverse();
      }
    }
  }

  else{
    arr.sort(function(a, b) {
    a = transform(a);
    b = transform(b);


    if(order === 1){
      return a - b;
    }
    else if(order === -1){
      return b - a;
    }
    });
  }
  return arr;
};
โžฐ ๋” ๊น”๋”ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ.....
โžฐ ๋ฐฐ์—ด ์š”์†Œ๊ฐ€ string์ผ ๊ฒฝ์šฐ && transform์ด ์ฃผ์–ด์ง€์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” sort()๋กœ ๋ฐ”๋กœ ์ •๋ ฌ ๊ฐ€๋Šฅํ•˜๋‹ค.
โžฐ string์ด ์•„๋‹ ๊ฒฝ์šฐ(number์ผ ๊ฒฝ์šฐ), sortํ•จ์ˆ˜๋Š” ๋ฌธ์ž์—ด์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋กœ ์กฐ๊ฑด์„ ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

 

6๏ธโƒฃ memoize

โžฐ ์ฝœ๋ฐฑํ•จ์ˆ˜์— ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ•œ๋‹ค.

โžฐ ๋ฉ”๋ชจ์ด์ œ์ด์…˜ : ์ด๋ฏธ ํ•ด๊ฒฐํ•œ ๋ฌธ์ œ๋Š” ๋‹ค์‹œ ํ’€์ง€ ์•Š๋Š” ๊ธฐ๋ฒ•

โžฐ ์•ž์„œ ์ง„ํ–‰ํ–ˆ๋˜ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด๋‘๊ณ  ๊ฐ™์€ ์—ฐ์‚ฐ์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ ์ €์žฅ๋œ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํ„ดํ•ด์ค€๋‹ค.

_.memoize = function (func) { // ์บ์‹œ๊ธฐ๋Šฅ?
  // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  let memo = {};  // ์ „ ์‹คํ–‰ ๊ฐ’ ์ €์žฅํ•˜๋Š” ๊ณณ

  return function(...arguments){  //func ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ญ๊ฐ€ ๋“ค์–ด์˜ฌ์ง€ ๋ชจ๋ฅด๋‹ˆ
    let key = JSON.stringify(...arguments); // ๊ฐ์ฒด์— ํ‚ค๋กœ ๋„ฃ์–ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ json.stringify ์‚ฌ์šฉ

    if(memo[key] === undefined){  // memo์— ์—†๋‹ค๋ฉด
      memo[key] = func(...arguments)  // ๊ฐ’ ๋„ฃ์–ด์ฃผ๊ธฐ
    }
    return memo[key]; // memo์—์„œ ๊ฐ’ ๊บผ๋‚ด์„œ ๋ฆฌํ„ดํ•ด์ฃผ๊ธฐ
  }

};
โžฐ ์ด๋ฏธ ์ง„ํ–‰ํ•œ ์—ฐ์‚ฐ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•ด ๋‘˜ ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ณ , ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ๋“ค์–ด์˜จ ๊ฐ’์„ key๋กœ ๋„ฃ์–ด์ค€๋‹ค.
โžฐ ๊ทธ ํ‚ค์˜ ๊ฐ’์ด ์—†๋‹ค๋ฉด ์—ฐ์‚ฐํ•œ ์ ์ด ์—†๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋ฅผ ๋„ฃ์–ด์ฃผ๊ณ , ๋ฆฌํ„ดํ•œ๋‹ค.
โžฐ ์ด๋ฏธ ๊ทธ ํ‚ค์˜ ๊ฐ’์ด ์žˆ๋‹ค๋ฉด ์—ฐ์‚ฐํ•œ ์ ์ด ์žˆ๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ €์žฅ๋œ ๊ฐ์ฒด์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.

 

7๏ธโƒฃ throttle

โžฐ ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ์‹œ๊ฐ„ ๋™์•ˆ์— ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ๋‹จ ํ•œ๋ฒˆ๋งŒ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

_.throttle = function (func, wait) {
  // TODO: ์—ฌ๊ธฐ์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
  let canStartCallback = true;
  
  return function(){
    if(canStartCallback){
      func();
      canStartCallback = false;
      setTimeout(function(){
        canStartCallback = true;
      }, wait)
    }
  }
};
โžฐ canStartCallback์œผ๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค.
โžฐ ์ฒ˜์Œ ์‹คํ–‰ํ–ˆ์„ ๋•Œ ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•ด์ฃผ๊ณ  ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ false๋กœ ๋ฐ”๊ฟ”์ค€๋‹ค.
โžฐ setTimeout์œผ๋กœ wait ์‹œ๊ฐ„๋งŒํผ ๊ธฐ๋‹ค๋ฆฐ ๋’ค ์‹คํ–‰ ์—ฌ๋ถ€๋ฅผ true๋กœ ๋ฐ”๊ฟ”์ฃผ๋ฉด ๊ทธ ์‹œ๊ฐ„ ๋™์•ˆ์—๋Š” ์ฝœ๋ฐฑ ํ•จ์ˆ˜๊ฐ€ ํ•œ๋ฒˆ๋งŒ ํ˜ธ์ถœ ๋œ๋‹ค.

 

๐Ÿ“Œ argument, spread, ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์—ฐ์Šตํ•˜๊ธฐ์— ์ข‹์€ ๊ณผ์ œ์˜€๋‹ค.