๐Ÿ“… TIL #27

์–ธ๋”๋ฐ” part1


์˜ค๋Š˜์€ ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฐ์—ด ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๋“ค์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ณผ์ œ๊ฐ€ ์ฃผ์–ด์กŒ๋‹ค.

Underbar๋Š” underscore.js, lodash ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ชจํ‹ฐ๋ธŒ๋กœ ํ•˜์—ฌ ์ฝ”๋“œ์Šคํ…Œ์ด์ธ ์—์„œ ์ง์ ‘ ๋งŒ๋“  ๋ฐฐ์—ด ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„ ๊ณผ์ œ์ด๋‹ค.

๋‚˜๋Š” ์ด๋ฒˆ์— ๋ฐฐ์—ด ๋‚ด์žฅ ๋ฉ”์†Œ๋“œ๋“ค์„ ์ง์ ‘ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ•  ์ง€ ์ƒ๊ฐํ•ด๋ณด๊ณ  ํ•˜๋Š” ๊ณผ์ •์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ’€ ๋•Œ ์ฒ˜๋Ÿผ ์ •๋ง ์žฌ๋ฐŒ๊ฒŒ ๋Š๊ปด์กŒ๋‹ค!!

์‹ค์ œ๋กœ ๋ฉ”์†Œ๋“œ๋“ค์ด ์–ด๋–ป๊ฒŒ ์“ฐ์˜€๋Š”์ง€ ์ƒ๊ฐํ•ด๋ณด๋ฉด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค!

๊ทธ๋ž˜์„œ ์ด๋ฒˆ ๊ณผ์ œ๋Š” ์ •๋ง ์ฆ๊ฒ๊ฒŒ ํ–ˆ๋˜ ๊ฒƒ ๊ฐ™๋‹ค :)

๋งŽ์€ ๋ฐฐ์—ด ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ–ˆ์ง€๋งŒ ์˜ค๋Š˜์€ ๊ทธ ์ค‘์—์„œ ๋Œ€ํ‘œ์ ์œผ๋กœ ๋ช‡ ๊ฐœ๋งŒ ๋ธ”๋กœ๊น… ํ•ด๋ณผ ์˜ˆ์ •์ด๋‹ค!


๐Ÿ‘‰ each ๊ตฌํ˜„

  • ๋ฌธ์ œ ์„ค๋ช…
  1. _.each๋Š” collection์˜ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋ฐ˜๋ณต์ ์ธ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  2. collection(๋ฐฐ์—ด ํ˜น์€ ๊ฐ์ฒด)๊ณผ ํ•จ์ˆ˜ iteratee(๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…)๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌ๋ฐ›์•„ (iteratee๋Š” ํ•จ์ˆ˜์˜ ์ธ์ž๋กœ ์ „๋‹ฌ๋˜๋Š” ํ•จ์ˆ˜์ด๋ฏ€๋กœ callback ํ•จ์ˆ˜)
  3. collection์˜ ๋ฐ์ดํ„ฐ(element ๋˜๋Š” property)๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ
  4. iteratee์— ๊ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ธ์ž๋กœ ์ „๋‹ฌํ•˜์—ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.


์ด ๋ฌธ์ œ๋Š” ๋ฐฐ์—ด์ธ์ง€ ๊ฐ์ฒด์ธ์ง€ ๊ตฌ๋ถ„์„ ํ•˜๊ณ  ์ฃผ์–ด์ง„ ํ•จ์ˆ˜ iteratee๋ฅผ ์ž˜ ํ™œ์šฉํ•ด์„œ ๋ฐ˜๋ณต๋ฌธ ์ฒ˜๋Ÿผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฌธ์ œ์˜€๋‹ค.

ํ”ํžˆ ์•Œ๊ณ ์žˆ๋Š” forEach ๋ฉ”์†Œ๋“œ์ธ ๊ฒƒ ๊ฐ™๋‹ค.


_.each = function (collection, iteratee) {
  if (Array.isArray(collection)) {
    // ๋ฐฐ์—ด์ธ์ง€ ๊ตฌ๋ถ„
    for (let i = 0; i < collection.length; i++) {
      iteratee(collection[i], i, collection); // collection์˜ ์š”์†Œ, ์ธ๋ฑ์Šค, ๋ฐฐ์—ด ์ž์ฒด์— ์ ‘๊ทผํ•œ๋‹ค.
    }
  } else if (typeof collection === "object") {
    for (let key in collection) {
      iteratee(collection[key], key, collection);
    }
  }
};


์ด๋Ÿฐ์‹์œผ๋กœ ์–ธ๋”๋ฐ” ๊ณผ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค. ์ค‘์š”ํ•œ ํฌ์ธํŠธ๋Š” ํƒ€์ž…์„ ๊ตฌ๋ถ„ํ•˜๊ณ  ์ฃผ์–ด์ง„ ํ•จ์ˆ˜๋กœ ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ด์˜€๋‹ค!



๐Ÿ‘‰ filter ๊ตฌํ˜„

  • ๋ฌธ์ œ ์„ค๋ช…
  1. .filter๋Š” test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋‹ด์€ ์ƒˆ๋กœ์šด ๋ฐฐ์—ด(์ƒ๋กœ์šฐ ์นดํ”ผ)์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
  2. test(element)์˜ ๊ฒฐ๊ณผ(return ๊ฐ’)๊ฐ€ truthy์ผ ๊ฒฝ์šฐ, ํ†ต๊ณผ์ž…๋‹ˆ๋‹ค.
  3. test ํ•จ์ˆ˜๋Š” ๊ฐ ์š”์†Œ์— ๋ฐ˜๋ณต ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.


์ •๋ง ์นœ์ˆ™ํ•œ ๋ฌธ์ œ์˜€๋‹ค. filter๋Š” ๋งŽ์ด ์“ฐ๋Š” ๋ฉ”์†Œ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ํ’€์–ด๋ณผ ์ˆ˜ ์žˆ์—ˆ๋‹ค.


_.filter = function (arr, test) {
  let result = [];

  _.each(arr, function (item) {
    if (test(item)) {
      result.push(item);
    }
  });
  return result;
};


test ํ•จ์ˆ˜๋ฅผ ํ†ต๊ณผํ•œ ์š”์†Œ๋งŒ ๋‹ด์•„์ฃผ๊ธฐ! ๋ง ๊ทธ๋Œ€๋กœ ๊ฑธ๋Ÿฌ์ฃผ๊ธฐ์˜€๋‹ค!



๐Ÿ‘‰ uniq ๊ตฌํ˜„

  • ๋ฌธ์ œ ์„ค๋ช…
  1. _.uniq๋Š” ์ฃผ์–ด์ง„ ๋ฐฐ์—ด์˜ ์š”์†Œ๊ฐ€ ์ค‘๋ณต๋˜์ง€ ์•Š๋„๋ก ์ƒˆ๋กœ์šด ๋ฐฐ์—ด์„ ๋ฆฌํ„ดํ•ฉ๋‹ˆ๋‹ค.
  2. ์ค‘๋ณต ์—ฌ๋ถ€์˜ ํŒ๋‹จ์€ ์—„๊ฒฉํ•œ ๋™์น˜ ์—ฐ์‚ฐ(strict equality, ===)์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ์ž…๋ ฅ์œผ๋กœ ์ „๋‹ฌ๋˜๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋Š” ๋ชจ๋‘ primitive value๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.


์ด ๋ฌธ์ œ๋Š” ๋ฏธ๋ฆฌ ๊ตฌํ˜„ํ•œ indexOf๋ฅผ ํ™œ์šฉํ•ด์„œ ํ’€ ์ˆ˜ ์žˆ์—ˆ๋‹ค.(์‹ค์ œ indexOf์™€ ๊ฐ™์Œ)


_.uniq = function (arr) {
  let result = [];

  _.each(arr, function (item) {
    if (_.indexOf(result, item) === -1) {
      result.push(item);
    }
  });
  return result;
};


indexOf๊ฐ€ -1์ด๋ฉด ์ค‘๋ณต๋˜๋Š” ๊ฐ’์ด ์—†๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ ์ด ์ ์„ ํ™œ์šฉํ•ด์„œ ๋ฌธ์ œ๋ฅผ ํ’€์—ˆ๋‹ค.



๐Ÿ‘‰ reduce ๊ตฌํ˜„

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


์ด ๋ฌธ์ œ๋Š” ์‹ค์ œ reduce ๋ฉ”์†Œ๋“œ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์•˜๋‹ค.

๊ทธ๋ž˜์„œ ์ดˆ๊ธฐ๊ฐ’์ด ์žˆ์„๋•Œ์™€ ์—†์„๋•Œ๋ฅผ ๊ตฌ๋ถ„์ง€์–ด ์–ด๋–ป๊ฒŒ ์กฐ๊ฑด์„ ๋งŒ๋“ค์–ด์„œ ํ’€์ง€๊ฐ€ ๊ด€๊ฑด์ด์—ˆ๋‹ค.


_.reduce = function (arr, iteratee, initVal) {
  let result = 0;

  _.each(arr, function (item, idx) {
    if (initVal === undefined) {
      if (idx === 0) {
        result = item;
      } else {
        result = iteratee(result, item);
      }
    } else {
      initVal = iteratee(initVal, item, idx, arr);
      result = initVal;
    }
  });
  return result;
};


๋‚˜๊ฐ™์€ ๊ฒฝ์šฐ๋Š”, ๊ฐ€์žฅ ๋จผ์ € ์ดˆ๊ธฐ๊ฐ’์ด ์—†๋Š”์ง€์™€ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜์˜€๋‹ค.

๊ทธ ํ›„์— ์—†๋Š” ๊ฒฝ์šฐ๋Š” ์ดˆ๊ธฐ๊ฐ’์„ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ ์š”์†Œ๋กœ ํ•ด์ฃผ๊ณ  ๊ทธ๋’ค๋กœ๋Š” ๋ฐ˜๋ณต์ž‘์—…์„ ํ•ด์ฃผ๋Š” iteratee๋ฅผ ํ™œ์šฉํ–ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ดˆ๊ธฐ๊ฐ’์ด ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š”?

์ดˆ๊ธฐ๊ฐ’์„ ๋ชจ๋“  ์š”์†Œ์— ์ ‘๊ทผํ•ด์„œ ๋ฐ˜๋ณต์ž‘์—…์„ ๊ฑฐ์นœ ํ›„, ๋‹ค์‹œ ํ• ๋‹น์„ ํ•ด์ฃผ์—ˆ๋‹ค.



์˜ค๋Š˜ ๊ณผ์ œ๋Š” ์ •๋ง ์—ฌ์œ ๋กญ๊ฒŒ ์ž˜ ๋งˆ๋ฌด๋ฆฌ ํ•œ ๊ฒƒ ๊ฐ™์•„์„œ ๊ธฐ๋ถ„์ด ์ข‹๋‹ค!

๋‚ด์ผ ์–ธ๋”๋ฐ” ๊ณผ์ œ part2 ๊นŒ์ง€ ๋๋‚ด๋ฉด ์–ธ๋”๋ฐ” ์Šคํ”„๋ฆฐํŠธ๋„ ๋์ด๋‹ค.



๐Ÿ‘Š ๋‚ด์ผ์˜ TIW(today I Will)

์–ธ๋”๋ฐ” part2