[TECH-QA] ES6+์—์„œ ๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง(...rest)

_.omit๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ

lodash์—์„œ _.omit๊ณผ _.pick์€ ๊ฐ์ฒด์—์„œ ํŠน์ • ์†์„ฑ์„ ํ•„ํ„ฐ๋งํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์œ ํ‹ธ๋ฆฌํ‹ฐ ํ•จ์ˆ˜๋กœ, ๋น„์Šทํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€์ง€๋งŒ ๋™์ž‘ ๋ฐฉ์‹์ด ๋ฐ˜๋Œ€์ž…๋‹ˆ๋‹ค. ์•„๋ž˜์— ์ฐจ์ด์ ์„ ๊ฐ„๋‹จํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ES6+์—์„œ ๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง(...rest)์„ ์‚ฌ์šฉํ•ด _.omit๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ...rest๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.
const object = { a: 1, b: 2, c: 3 };

// a์™€ c๋ฅผ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์†์„ฑ์„ ์ถ”์ถœ
const { a, c, ...rest } = object;

console.log(rest); // { b: 2 }
  • ...rest: ๊ฐ์ฒด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์—์„œ ๋ช…์‹œ์ ์œผ๋กœ ์„ ํƒํ•œ ์†์„ฑ(a, c)์„ ์ œ์™ธํ•œ ๋‚˜๋จธ์ง€ ์†์„ฑ์„ rest ๊ฐ์ฒด์— ์ˆ˜์ง‘ํ•ฉ๋‹ˆ๋‹ค.
  • ๋™์ž‘: _.omit(object, ['a', 'c'])์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜.
  • ์žฅ์ : Lodash ์—†์ด ๋„ค์ดํ‹ฐ๋ธŒ JavaScript๋กœ ๊ฐ„๋‹จํžˆ ๊ตฌํ˜„ ๊ฐ€๋Šฅ.
  • ์ œํ•œ: ์ œ์™ธํ•  ์†์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋ณ€์ˆ˜๋กœ ์„ ์–ธํ•ด์•ผ ํ•˜๋ฏ€๋กœ, ๋™์ ์œผ๋กœ ์†์„ฑ ๋ชฉ๋ก์„ ์ฒ˜๋ฆฌํ•˜๋ ค๋ฉด ์ถ”๊ฐ€ ๋กœ์ง์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ“ ๋™์  ์†์„ฑ ์ œ์™ธ ์˜ˆ์ œ

const object = { a: 1, b: 2, c: 3 };
const keysToOmit = ['a', 'c'];

const result = Object.fromEntries(
  Object.entries(object).filter(([key]) => !keysToOmit.includes(key))
);

console.log(result); // { b: 2 }

๐Ÿ“ Object.entries(object)

  • Object.entries๋Š” ๊ฐ์ฒด์˜ ํ‚ค-๊ฐ’ ์Œ์„ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ ๊ฐ์ฒด: object = { a: 1, b: 2, c: 3 }
  • ์ถœ๋ ฅ: [['a', 1], ['b', 2], ['c', 3]]
  • ๊ฐ ์š”์†Œ๋Š” [key, value] ํ˜•ํƒœ์˜ ๋ฐฐ์—ด์ž…๋‹ˆ๋‹ค.

๐Ÿ“ .filter(([key]) => !keysToOmit.includes(key))

  • filter ๋ฉ”์„œ๋“œ๋Š” ๋ฐฐ์—ด์˜ ์š”์†Œ๋ฅผ ์กฐ๊ฑด์— ๋”ฐ๋ผ ๊ฑธ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค.
  • [key]๋Š” ๋ฐฐ์—ด ๋””์ŠคํŠธ๋Ÿญ์ฒ˜๋ง์„ ์‚ฌ์šฉํ•ด ๊ฐ ํ‚ค-๊ฐ’ ์Œ์—์„œ key๋งŒ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค. (๊ฐ’์€ ๋ฌด์‹œ๋จ)
  • keysToOmit์€ ์ œ์™ธํ•˜๋ ค๋Š” ํ‚ค๊ฐ€ ๋‹ด๊ธด ๋ฐฐ์—ด, ์˜ˆ: ['a', 'c'].
  • !keysToOmit.includes(key)๋Š” key๊ฐ€ keysToOmit ๋ฐฐ์—ด์— ์—†์œผ๋ฉด true๋ฅผ ๋ฐ˜ํ™˜.
  • ์˜ˆ: key = 'a' โ†’ keysToOmit.includes('a')๋Š” true์ด๋ฏ€๋กœ !true๋Š” false โ†’ ์ œ์™ธ. key = 'b' โ†’ keysToOmit.includes('b')๋Š” false์ด๋ฏ€๋กœ !false๋Š” true โ†’ ์œ ์ง€.
  • ํ•„ํ„ฐ๋ง ๊ฒฐ๊ณผ: [['b', 2]] (a์™€ c๋Š” ์ œ์™ธ๋จ).

๐Ÿ“ Object.fromEntries(...)

  • Object.fromEntries๋Š” ํ‚ค-๊ฐ’ ์Œ ๋ฐฐ์—ด์„ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž…๋ ฅ: [['b', 2]]
  • ์ถœ๋ ฅ: { b: 2 }

๐Ÿ“ ๊ฒฐ๊ณผ

  • Object.entries๋กœ ๊ฐ์ฒด๋ฅผ ํ‚ค-๊ฐ’ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜.
  • filter๋กœ ์ œ์™ธํ•  ํ‚ค(keysToOmit)๋ฅผ ์ œ์™ธํ•œ ํ•ญ๋ชฉ๋งŒ ์œ ์ง€.
  • Object.fromEntries๋กœ ํ•„ํ„ฐ๋ง๋œ ๋ฐฐ์—ด์„ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜.
  • ๊ฒฐ๊ณผ์ ์œผ๋กœ, ์ง€์ •๋œ ํ‚ค๋ฅผ ์ œ์™ธํ•œ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑ.
  • ์ž…๋ ฅ: object = { a: 1, b: 2, c: 3 }, keysToOmit = ['a', 'c']
  • ์ถœ๋ ฅ: result = { b: 2 }
  • ์ด๋Š” _.omit(object, ['a', 'c'])์™€ ๋™์ผํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜.

_.pick๊ณผ ์œ ์‚ฌํ•œ ํšจ๊ณผ

_.pick์„ ๋Œ€์ฒดํ•˜๋ ค๋ฉด, ํŠน์ • ์†์„ฑ๋งŒ ์„ ํƒํ•ด ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐฉ์‹
const object = { a: 1, b: 2, c: 3 };
const keysToPick = ['a', 'c'];

const result = Object.fromEntries(
  Object.entries(object).filter(([key]) => keysToPick.includes(key))
);

console.log(result); // { a: 1, c: 3 }
  • - ...rest๋Š” _.omit๊ณผ ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ œ๊ณตํ•˜์ง€๋งŒ, ๋™์  ์†์„ฑ ์ฒ˜๋ฆฌ๋Š” ์ถ”๊ฐ€ ์ฝ”๋“œ ํ•„์š”.
  • - Object.entries์™€ Object.fromEntries๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด _.omit๊ณผ _.pick ๋ชจ๋‘ ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์ฒด ๊ฐ€๋Šฅ.