# * Learning JavaScript - ๋ฐฐ์—ด 2ํŽธ

Written by ๐Ÿ“ Tesilio

์ด ํฌ์ŠคํŒ…์€ Learning JavaScript์˜ 8์žฅ(๋ฐฐ์—ด๊ณผ ๋ฐฐ์—ด ์ฒ˜๋ฆฌ)์„ ์ฐธ๊ณ ํ•˜์—ฌ ์ž‘์„ฑ ๋˜์—ˆ๋‹ค.


# map๊ณผ filter

map๊ณผ filter๋Š” ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ ์ค‘ ๊ฐ€์žฅ ์œ ์šฉํ•œ ๋ฉ”์„œ๋“œ์ด๋‹ค. ์ด๋“ค ๋ฉ”์„œ๋“œ๋กœ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์€ ์ •๋ง ๋‹ค์–‘ํ•˜๋‹ค.

map์€ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ๋ณ€ํ˜•ํ•œ๋‹ค. ๋ญ๋“  ๊ฐ€๋Šฅํ•˜๋‹ค.
์ˆซ์ž๊ฐ€ ๋“ค์–ด์žˆ๋Š” ๊ฐ์ฒด๊ฐ€ ์žˆ๋Š”๋ฐ, ํ•„์š”ํ•œ ๊ฑด ์ˆซ์ž๋ผ๋ฉด? ๊ฐ„๋‹จํ•˜๋‹ค. ํ•จ์ˆ˜๋กœ ๊ตฌ์„ฑ๋œ ๋ฐฐ์—ด์ด ์žˆ๋Š”๋ฐ, ํ”„๋ผ๋ฏธ์Šค(promise)๊ฐ€ ํ•„์š”ํ•˜๋‹ค? ๊ฐ„๋‹จํ•˜๋‹ค.
์ผ์ •ํ•œ ํ˜•์‹์˜ ๋ฐฐ์—ด์„ ๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๋ฉด map์„ ์“ฐ๋ฉด ๋œ๋‹ค. map๊ณผ filter๋Š” ๋ชจ๋‘ ์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์›๋ž˜ ๋ฐฐ์—ด์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.

์˜ˆ์ œ๋ฅผ ๋ณด์ž.

const cart = [
  {
    name: 'Widget',
    price: 9.95,
  },
  {
    name: 'Gadget',
    price: 22.95,
  }
];

const names = cart.map(x => x.name);
// ['Widget', 'Gadget']

const prices = cart.map(x => x.price);
// [9.95, 22.95]

const discountPrices = prices.map(x => x * 0.8);
// [7.96, 18.36]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๊ฐ ์š”์†Œ์—์„œ ํ˜ธ์ถœ๋  ๋•Œ ์š”์†Œ ์ž์ฒด์™€ ์š”์†Œ ์ธ๋ฑ์Šค, ๋ฐฐ์—ด ์ „์ฒด๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›๋Š”๋‹ค(๋ฐฐ์—ด ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€๋Š” ์•Š๋‹ค).

๋‹ค์Œ ์˜ˆ์ œ์—๋Š” ๋‘ ๋ฐฐ์—ด์— ์ƒํ’ˆ๊ณผ ๊ฐ€๊ฒฉ์ด ๋”ฐ๋กœ ์ €์žฅ๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด ๋‘˜์„ ๊ฐ์ฒด๋กœ ๊ฒฐํ•ฉํ•ด ๋ณด์ž.

const items = ['Widget', 'Gadget'];
const prices = [9.95, 22.95];
const cart = items.map((x, i) => ({name: x, price: prices[i]}));
// cart: [{ name: 'Widget', price: 9.95 }, { name: 'Gadget', price: 22.95 }]
1
2
3
4

์ด ์˜ˆ์ œ๋Š” ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜์ง€๋งŒ, mapํ•จ์ˆ˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ์ž˜ ํ‘œํ˜„ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์š”์†Œ ์ž์ฒด(x)๋งŒ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ธ๋ฑ์Šค(i)๋„ ์‚ฌ์šฉํ–ˆ๋‹ค.
์ธ๋ฑ์Šค๋ฅผ ์“ด ๊นŒ๋‹ญ์€ items์˜ ์š”์†Œ์™€ prices์˜ ์š”์†Œ๋ฅผ ์ธ๋ฑ์Šค์— ๋”ฐ๋ผ ๊ฒฐํ•ฉํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ์—ฌ๊ธฐ์„œ map์€ ๋‹ค๋ฅธ ๋ฐฐ์—ด์—์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋ฌธ์ž์—ด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์„ ๊ฐ์ฒด ๋ฐฐ์—ด๋กœ ๋ณ€ํ˜•ํ–ˆ๋‹ค.

๊ฐ์ฒด๋ฅผ ๊ด„ํ˜ธ๋กœ ๊ฐ์‹ผ ์ด์œ ๋Š”, ์ด๋ ‡๊ฒŒํ•˜์ง€ ์•Š์œผ๋ฉด ํ™”์‚ดํ‘œ ํ‘œ๊ธฐ๋ฒ•์—์„œ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด์˜ ์ค‘๊ด„ํ˜ธ๋ฅผ ๋ธ”๋ก์œผ๋กœ ํŒ๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

filter๋Š” ์ด๋ฆ„์ด ์•”์‹œํ•˜๋“ฏ ๋ฐฐ์—ด์—์„œ ํ•„์š”ํ•œ ๊ฒƒ๋“ค๋งŒ ๋‚จ๊ธธ ๋ชฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์กŒ๋‹ค. filter๋Š” map๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‚ฌ๋ณธ์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ƒˆ ๋ฐฐ์—ด์—๋Š” ํ•„์š”ํ•œ ์š”์†Œ๋งŒ ๋‚จ๋Š”๋‹ค. ์–ด๋–ค ์š”์†Œ๋ฅผ ๋‚จ๊ธธ์ง€๋Š” ๋งˆ์Œ๋Œ€๋กœ์ด๋‹ค.

์˜ˆ์ œ๋ฅผ ๋ณด์ž.

// ์นด๋“œ ๋ฑ์„ ๋งŒ๋“ ๋‹ค.
const cards = [];
for (let suit of ['H', 'C', 'D', 'S'])
  for (let value = 1; value <= 13; value += 1)
    cards.push({ suit, value});
  
// value ๊ฐ€ 2์ธ ์นด๋“œ
cards.filter(c => c.value === 2);
// [
//   { suit: 'H', value: 2 },
//   { suit: 'C', value: 2 },
//   { suit: 'D', value: 2 },
//   { suit: 'S', value: 2 },
// ]

// ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ๋Š” ๋ฐ˜ํ™˜๋œ ๋ฐฐ์—ด์˜ ๊ธธ์ด๋งŒ ์ ๋Š”๋‹ค.

// ๋‹ค์ด์•„๋ชฌ๋“œ
cards.filter(c => c.suit === 'D');  // length: 13

// ํ‚น, ํ€ธ, ์ฃผ๋‹ˆ์–ด
cards.filter(c => c.value > 10);  // length: 12

// ํ•˜ํŠธ์˜ ํ‚น, ํ€ธ, ์ฃผ๋‹ˆ์–ด
cards.filter(c => c.value > 10 && c.suit === 'H');  // length: 3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

map๊ณผ filter๋ฅผ ๊ฒฐํ•ฉํ•˜๋ฉด ์ •๋ง ๋‹ค์–‘ํ•œ ์ผ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์•ž์—์„œ ๋งŒ๋“  ์นด๋“œ ๋ฑ์„ ์งง์€ ๋ฌธ์ž์—ด๋กœ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๊ณ  ํ•˜์ž.
์นด๋“œ ๊ทธ๋ฆผ(suit: ํ•˜ํŠธ, ํด๋กœ๋ฒ„, ๋‹ค์ด์•„๋ชฌ๋“œ, ์ŠคํŽ˜์ด๋“œ)์—๋Š” ์œ ๋‹ˆ์ฝ”๋“œ ์ฝ”๋“œ ํฌ์ธํŠธ๋ฅผ ์“ฐ๊ณ  ์—์ด์Šค์™€ ํ‚น, ํ€ธ, ์ฃผ๋‹ˆ์–ด๋Š” ์ˆซ์ž ๋Œ€์‹  ๊ฐ๊ฐ A, K, Q, J๋ฅผ ์“ฐ๊ฒ ๋‹ค. ์—ฌ๊ธฐ์— ํ•„์š”ํ•œ ํ•จ์ˆ˜๋Š” ์กฐ๊ธˆ ๊ธธ์–ด์ง€๋ฏ€๋กœ ์ต๋ช… ํ•จ์ˆ˜๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ๋”ฐ๋กœ ๋งŒ๋“ ๋‹ค.

function cardToString(c) {
  const suits = {
    'H': '\u2665',
    'C': '\u2663',
    'D': '\u2666',
    'S': '\u2660',
  };
  const values = {
    1: 'A',
    11: 'J',
    12: 'Q',
    13: 'K',
  };
  // cardToString์„ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋งค๋ฒˆ ๊ฐ’์„ ๋งŒ๋“œ๋Š” ๊ฑด ๊ทธ๋ฆฌ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์•„๋‹ˆ๋‹ค.
  // ๋” ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์€ ์—ฐ์Šต๋ฌธ์ œ๋กœ ๋‚จ๊ธด๋‹ค.
  for(let i = 2; i <=10; i += 1) values[i] = i;
  return values[c.value] + suits[c.suit];
}

// ์นด๋“œ ๋ฑ์„ ๋งŒ๋“ ๋‹ค.
const cards = [];
for (let suit of ['H', 'C', 'D', 'S'])
  for (let value = 1; value <= 13; value += 1)
    cards.push({ suit, value });

// value๊ฐ€ 2์ธ ์นด๋“œ
cards.filter(c => c.value === 2)
  .map(cardToString);   // ['2โ™ฅ', '2โ™ฃ', '2โ™ฆ', '2โ™ '];

// ํ•˜ํŠธ์˜ ํ‚น, ํ€ธ, ์ฃผ๋‹ˆ์–ด
cards.filter(c => c.value > 10 && c.suit === 'H')
  .map(cardToString);   // ['Jโ™ฅ', 'Qโ™ฅ', 'Kโ™ฅ'];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

# ๋ฐฐ์—ด์˜ ๋งˆ๋ฒ• reduce

map์ด ๋ฐฐ์—ด์˜ ๊ฐ ์š”์†Œ๋ฅผ ๋ณ€ํ˜•ํ•œ๋‹ค๋ฉด reduce๋Š” ๋ฐฐ์—ด ์ž์ฒด ๋ฅผ ๋ณ€ํ˜•ํ•œ๋‹ค. reduce๋ผ๋Š” ์ด๋ฆ„์€ ์ด ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณดํ†ต ๋ฐฐ์—ด์„ ๊ฐ’ ํ•˜๋‚˜๋กœ ์ค„์ด๋Š” ๋ฐ ์“ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ™์—ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐฐ์—ด์— ๋“ค์–ด์žˆ๋Š” ์ˆซ์ž๋ฅผ ๋”ํ•˜๊ฑฐ๋‚˜ ํ‰๊ท ์„ ๊ตฌํ•˜๋Š” ๊ฒƒ์€ ๋ฐฐ์—ด์„ ๊ฐ’ ํ•˜๋‚˜๋กœ ์ค„์ด๋Š” ๋™์ž‘์ด๋‹ค. ํ•˜์ง€๋งŒ reduce๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ’ ํ•˜๋‚˜ ๋Š” ๊ฐ์ฒด์ผ ์ˆ˜๋„ ์žˆ๊ณ , ๋‹ค๋ฅธ ๋ฐฐ์—ด์ผ ์ˆ˜๋„ ์žˆ๋‹ค.
์‚ฌ์‹ค reduce๋Š” map๊ณผ filter๋ฅผ ๋น„๋กฏํ•ด ์—ฌํƒœ๊นŒ์ง€ ์„ค๋ช…ํ•œ ๋ฐฐ์—ด ๋ฉ”์„œ๋“œ์˜ ๋™์ž‘์„ ๋Œ€๋ถ€๋ถ„ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

reduce๋Š” map์ด๋‚˜ filter์™€ ๋งˆ์ฐฌ์ง€๋กœ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์—ฌํƒœ๊นŒ์ง€ ์„ค๋ช…ํ•œ ์ฝœ๋ฐฑ์—์„œ ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ํ•ญ์ƒ ํ˜„์žฌ ๋ฐฐ์—ด ์š”์†Œ์˜€์ง€๋งŒ, reduce๋Š” ๋‹ค๋ฅด๋‹ค.
reduce๊ฐ€ ๋ฐ›๋Š” ์ฒซ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋Š” ๋ฐฐ์—ด์ด ์ค„์–ด๋“œ๋Š” ๋Œ€์ƒ์ธ ์–ดํ๋ฎฌ๋ ˆ์ดํ„ฐ(accumulator) ์ด๋‹ค. ๋‘ ๋ฒˆ์งธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ถ€ํ„ฐ๋Š” ์—ฌํƒœ๊นŒ์ง€ ์„ค๋ช…ํ•œ ์ฝœ๋ฐฑ์˜ ์ˆœ์„œ๋Œ€๋กœ ํ˜„์žฌ ๋ฐฐ์—ด ์š”์†Œ, ํ˜„์žฌ ์ธ๋ฑ์Šค, ๋ฐฐ์—ด ์ž์ฒด์ด๋‹ค.

reduce๋Š” ์ดˆ๊นƒ๊ฐ’๋„ ์˜ต์…˜์œผ๋กœ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค. ๋ฐฐ์—ด์˜ ์ˆซ์ž๋ฅผ ๋”ํ•˜๋Š” ๋‹จ์ˆœํ•œ ์˜ˆ์ œ๋ฅผ ๋ณด์ž.

const arr = [5, 7, 2, 4];
const sum = arr.reduce((a, x) => a += x, 0);
1
2

reduce์˜ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ˆ„์ ๊ฐ’ a์™€ ํ˜„์žฌ ๋ฐฐ์—ด ์š”์†Œ x๋ฅผ ๋ฐ›์•˜๋‹ค. ์ด ์˜ˆ์ œ์—์„œ ๋ˆ„์ ๊ฐ’์€ 0์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. reduce์˜ ์ฒซ ์˜ˆ์ œ์ด๋‹ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ํ•œ ๋‹จ๊ณ„์”ฉ ์ง„ํ–‰ํ•˜๋ฉฐ ์ดํ•ดํ•ด ๋ณด๊ธฐ๋กœ ํ•˜์ž.

  1. ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ 5์—์„œ (์ต๋ช…) ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. a์˜ ์ดˆ๊นƒ๊ฐ’์€ 0์ด๊ณ  x์˜ ๊ฐ’์€ 5์ด๋‹ค. ํ•จ์ˆ˜๋Š” a์™€ x(5)์˜ ํ•ฉ์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฐ’์€ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ a์˜ ๊ฐ’์ด ๋œ๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ 7์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. a์˜ ์ดˆ๊นƒ๊ฐ’์€ ์ด์ „ ๋‹จ๊ณ„์—์„œ ์ „๋‹ฌํ•œ 5์ด๊ณ , x์˜ ๊ฐ’์€ 7์ด๋‹ค. ํ•จ์ˆ˜๋Š” a์™€ x์˜ ํ•ฉ 12๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด ๊ฐ’์€ ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ a์˜ ๊ฐ’์ด ๋œ๋‹ค.
  3. ์„ธ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ 2์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. ์ด ๋‹จ๊ณ„์—์„œ a๋Š” 12์ด๊ณ  x๋Š” 2์ด๋‹ค. ํ•œ์ˆ˜๋Š” a์™€ x์˜ ํ•ฉ์ธ 14๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  4. ๋„ค ๋ฒˆ์งธ์ด์ž ๋งˆ์ง€๋ง‰ ๋ฐฐ์—ด ์š”์†Œ์ธ 4์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. a๋Š” 14์ด๊ณ  x๋Š” 4์ด๋‹ค. ํ•จ์ˆ˜๋Š” a์™€ x์˜ ํ•ฉ์ธ 18์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ด ๊ฐ’์€ reduce์˜ ๊ฐ’์ด๊ณ  sum์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์ด๋‹ค.

์˜ˆ๋ฏผํ•œ ์‚ฌ๋žŒ์ด๋ผ๋ฉด a์— ๊ฐ’์„ ํ• ๋‹นํ•  ํ•„์š”๋„ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ˆˆ์น˜์ฑ˜์„ ๊ฒƒ์ด๋‹ค. ํ™”์‚ดํ‘œ ํ•จ์ˆ˜์—์„œ ๋ช…์‹œ์ ์ธ return๋ฌธ์ด ํ•„์š”ํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ฒ˜๋Ÿผ, ํ•จ์ˆ˜์—์„œ ์ค‘์šฉํ•œ ๊ฑด ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ•˜๋Š”๊ฐ€ ์ด๋ฏ€๋กœ ๊ทธ๋ƒฅ a + x๋ฅผ ๋ฐ˜ํ™˜ํ•ด๋„ ๋์„ ๊ฒƒ์ด๋‹ค.
ํ•˜์ง€๋งŒ reduce๋ฅผ ๋” ์ž˜ ํ™œ์šฉํ•˜๋ ค๋ฉด ๋ˆ„์ ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ๋ณ€ํ•˜๋Š”์ง€ ์ƒ๊ฐํ•˜๋Š” ์Šต๊ด€์„ ๊ธฐ๋ฅด๋Š” ๊ฒŒ ์ข‹๋‹ค.

๋” ํฅ๋ฏธ๋กœ์šด ์˜ˆ์ œ๋ฅผ ๋ณด๊ธฐ ์ „์—, ๋ˆ„์ ๊ฐ’์ด undefined๋กœ ์‹œ์ž‘ํ•œ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ์ง€ ์ƒ๊ฐํ•ด ๋ณด์ž. ๋ˆ„์ ๊ฐ’์ด ์ œ๊ณต๋˜์ง€ ์•Š์œผ๋ฉด reduece๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ๋ฅผ ์ดˆ๊นƒ๊ฐ’์œผ๋กœ ๋ณด๊ณ  ๋‘ ๋ฒˆ์งธ ์š”์†Œ์—์„œ๋ถ€ํ„ฐ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค.

์•ž ์˜ˆ์ œ์—์„œ ์ดˆ๊นƒ๊ฐ’์„ ์ƒ๋žตํ•˜๊ณ  ๋‹ค์‹œ ์ƒ๊ฐํ•ด ๋ณด์ž.

const arr = [5, 7, 2, 4];
const sum = arr.reduce((a, x) => a += x);
1
2
  1. ๋‘ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ 7์—์„œ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋œ๋‹ค. a์˜ ์ดˆ๊นƒ๊ฐ’์€ ์ฒซ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ์ธ 5์ด๊ณ  x์˜ ๊ฐ’์€ 7์ด๋‹ค. ํ•จ์ˆ˜๋Š” a์™€ x์ด ํ•ฉ์ธ 12๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์ด๊ฐ’์ด ๋‹ค์Œ ๋‹จ๊ณ„์—์„œ a์˜ ๊ฐ’์ด๋‹ค.
  2. ์„ธ ๋ฒˆ์งธ ๋ฐฐ์—ด ์š”์†Œ 2์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. a์˜ ์ดˆ๊นƒ๊ฐ’์€ 12์ด๊ณ  x์˜ ๊ฐ’์€ 2์ด๋‹ค. ํ•จ์ˆ˜๋Š” a์™€ x์˜ ํ•ฉ์ธ 14๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  3. ๋„ค ๋ฒˆ์งธ์ด์ž ๋งˆ์ง€๋ง‰ ๋ฐฐ์—ด ์š”์†Œ์ธ 4์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. a๋Š” 14์ด๊ณ  x๋Š” 4์ด๋‹ค. ํ•จ์ˆ˜๋Š” a์™€ x์˜ ํ•ฉ์ธ 18์„ ๋ฐ˜ํ™˜ํ•˜๋ฉฐ ์ด ๊ฐ’์€ reduce์˜ ๊ฐ’์ด๊ณ  sum์— ํ• ๋‹น๋˜๋Š” ๊ฐ’์ด๋‹ค.

๋‹จ๊ณ„๋Š” ํ•˜๋‚˜ ์ค„์—ˆ์ง€๋งŒ ๊ฒฐ๊ณผ๋Š” ๊ฐ™๋‹ค. ์ด ์˜ˆ์ œ๋ฅผ ํฌํ•จํ•ด, ๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์š”์†Œ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ดˆ๊นƒ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ์„ ๋•Œ๋Š” ์ดˆ๊นƒ๊ฐ’์„ ์ƒ๋žตํ•ด๋„ ๋œ๋‹ค.

reduce๋Š” ๋ณดํ†ต ์ˆซ์ž๋‚˜ ๋ฌธ์ž์—ด ๊ฐ™์€ ์›์‹œ ๊ฐ’์„ ๋ˆ„์ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ, ๊ฐ์ฒด ๋˜ํ•œ ๋ˆ„์ ๊ฐ’์ด ๋  ์ˆ˜ ์žˆ๊ณ  ์ด๋ฅผ ํ†ตํ•ด ์•„์ฃผ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ๋„ ๊ฐ„๊ณผํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ๋งŽ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์˜๋‹จ์–ด๋กœ ์ด๋ฃจ์–ด์ง„ ๋ฐฐ์—ด์ด ์žˆ๊ณ  ๊ฐ ๋‹จ์–ด๋ฅผ ์ฒซ ๊ธ€์ž์— ๋”ฐ๋ผ ๋ฌถ๋Š”๋‹ค๊ณ  ํ•˜๋ฉด reduce์™€ ํ•จ๊ป˜ ๊ฐ์ฒด๋ฅผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

const words = ['Beachball', 'Rodeo', 'Angel',
  'Aardvark', 'Xylophone', 'November', 'Chocolater',
  'Papaya', 'Uniform', 'Joker', 'Clover', 'Bali'];
const alphabetical = words.reduce((a, x) => {
  if ( !a[x[0]]) a[x[0]] = [];
  a[x[0]].push(x);
  return a;
}, {});
1
2
3
4
5
6
7
8

์ด ์˜ˆ์ œ๋Š” ์กฐ๊ธˆ ๋” ๋ณต์žกํ•˜์ง€๋งŒ ์›์น™์€ ๊ฐ™๋‹ค. ๋ฐฐ์—ด์˜ ๋ชจ๋“  ์š”์†Œ์—์„œ ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ์ „ ๋‹จ๊ณ„์˜ ๊ฒฐ๊ณผ์— ์ด ๋‹จ์–ด์˜ ์ฒซ ๋ฒˆ์งธ ๊ธ€์ž์ธ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋Ÿฐ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†๋‹ค๋ฉด ๋นˆ ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•œ๋‹ค.
์ฆ‰ 'Beachball'์„ ๋งŒ๋‚˜๋ฉด a.B ํ”„๋กœํผํ‹ฐ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ ๊ทธ๋Ÿฐ ํ”„๋กœํผํ‹ฐ๋Š” ์—†์œผ๋ฏ€๋กœ ๋นˆ ๋ฐฐ์—ด์„ ๋งŒ๋“ ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋‹จ์–ด๋ฅผ ์ ์ ˆํ•œ ๋ฐฐ์—ด์— ์ถ”๊ฐ€ํ•œ๋‹ค. 'Beachball'์€ a.B ํ”„๋กœํผํ‹ฐ๊ฐ€ ์—†์—ˆ์œผ๋ฏ€๋กœ ๋นˆ ๋ฐฐ์—ด์— ์ถ”๊ฐ€๊ณ , ๋งˆ์ง€๋ง‰์œผ๋กœ { B: [Beachball]}์ธ a๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.

reduce๋Š” ํ†ต๊ณ„์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ์ดํ„ฐ ์…‹์˜ ํ‰๊ท (mean)๊ณผ ๋ถ„์‚ฐ(variance)์„ ๊ณ„์‚ฐํ•œ๋‹ค๊ณ  ํ•ด ๋ณด์ž.

const data = [3.3, 5, 7.2, 12, 4, 6, 10.3];
// ๋„๋„์Šค ์ปค๋ˆ„์Šค(Donald Knuth)๊ฐ€ ๋ถ„์‚ฐ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ๋งŒ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.
const stats = data.reduce((a, x) => {
  a.N += 1;
  let delta = x - a.mean;
  a.mean += delta / a.N;
  a.M2 += delta * (x - a.mean);
  return a;
}, { N: 0, mean: 0, M2: 0 });
if (stats.N > 2) {
  stats.variance = stats.M2 / (stats.N - 1);
  stats.stdev = Math.sqrt(stats.variance);
}
1
2
3
4
5
6
7
8
9
10
11
12
13

๋ณ€์ˆ˜ ์—ฌ๋Ÿฌ ๊ฐœ, ํŠนํžˆ mean๊ณผ M2๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ด๋ฒˆ์—๋„ ๊ฐ์ฒด๋ฅผ ๋ˆ„์ ๊ฐ’์œผ๋กœ ์ผ๋‹ค. ์›ํ•œ๋‹ค๋ฉด N ๋Œ€์‹  ์ธ๋ฑ์Šค์—์„œ 1์„ ๋บ€ ๊ฐ’์„ ์จ๋„ ๋˜๊ธด ํ•œ๋‹ค.

reduce์˜ ์œ ์—ฐ์„ฑ์„ ์•Œ์•„๋ณด๊ธฐ ์œ„ํ•ด ํ•œ ๊ฐ€์ง€ ์˜ˆ์ œ๋ฅผ ๋” ์‚ดํŽด๋ณด๊ฒ ๋‹ค. ์˜ˆ์ œ ์ž์ฒด๋Š” ๋งค์šฐ ์กฐ์•…ํ•˜์ง€๋งŒ, ์ด๋ฒˆ์—๋Š” ๋ฌธ์ž์—ด์„ ๋ˆ„์ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

const words = [
  'Beachball',
  'Rodeo',
  'Angel',
  'Aardvark',
  'Xylophone',
  'November',
  'Chocolate',
  'Papaya',
  'Uniform',
  'Joker',
  'Clover',
  'Bali',
];
const longWords = words.reduce((a, w) => w.length > 6 ? a + ' ' + w : a, '').trim();
// longWords: 'Beachball Aardvark Xylophone November Chocolate Uniform'
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

์ด ์˜ˆ์ œ๋Š” ๋ฌธ์ž์—ด ๋ˆ„์ ๊ฐ’์„ ์จ์„œ 6๊ธ€์ž๊ฐ€ ๋„˜๋Š” ๋‹จ์–ด๋ฅผ ๋ชจ์•„ ๋ฌธ์ž์—ด ํ•˜๋‚˜๋กœ ๋งŒ๋“ค์—ˆ๋‹ค. reduce๋Œ€์‹  filter์™€ join์„ ์จ์„œ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. reduce๋‹ค์Œ์— trim์„ ํ˜ธ์ถœํ•œ ์ด์œ ๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด ๋ณด์ž.

Last Updated: 8/12/2019, 2:30:49 PM