ES6+ Basic2

์ธํ”„๋Ÿฐ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ JavaScript ES6+ / ์œ ์ธ๋™

map ํ•จ์ˆ˜

const map = (f, iter) => {
    let res = [];
    for (const p of iter) {
        res.push(f(p));
        // ์–ด๋–ค ๊ฐ’์„ ๋„ฃ์„์ง€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์œ„์ž„
    }
    return res;
}

log(map(p => p.name, products));
  • ๋‚ด์žฅ mapํ•จ์ˆ˜๋Š” array์˜ ํ”„๋กœํ† ํƒ€์ž…์— ์ž‘์„ฑ

  • ์œ„์™€ ๊ฐ™์ด ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅธ map ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์„ mapํ•  ์ˆ˜ ์žˆ์Œ

let m = new Map();
m.set('a', 10);
m.set('b', 20);
log(new Map(map(([k, v]) => [k, v * 2], m)));

filter

const filter = (f, iter) => {
    let res = [];
    for (const a of iter) {
        if (f(a)) res.push(a);
        // ์–ด๋–ค ์กฐ๊ฑด์„ ์ค„์ง€ ๋ณด์กฐ ํ•จ์ˆ˜์— ์œ„์ž„
    }
    return push;
};

-- ์œ„์™€ ๊ฐ™์ด ์ดํ„ฐ๋Ÿฌ๋ธ” ํ”„๋กœํ† ์ฝœ์„ ๋”ฐ๋ฅธ filter ํ•จ์ˆ˜๋Š” ๋ชจ๋“  ๊ฒƒ๋“ค์„ filterํ•  ์ˆ˜ ์žˆ์Œ

reduce

const reduce = (f, acc, iter) => {
    if (!iter) {
        iter = acc[Symbol.iterator]();
        acc = iter.next().value;
    }
    for (const a of iter) {
        acc = f(acc, a);
    }
    return acc;
};
  • ํŠน์ •ํ•œ ๊ฐ’์„ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ˆ„์ ํ•ด ๋‚˜๊ฐˆ๋•Œ ์‚ฌ์šฉ

์ค‘์ฒฉ ์‚ฌ์šฉ

  • map filter reduce ์ค‘์ฒฉ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅ

log(
    reduce(
        add,
        map(p => p.price,
            filter(p => p.price < 20000, products))));
    )
)

์ฝ”๋“œ๋ฅผ ๊ฐ’์œผ๋กœ ๋‹ค๋ฃจ์–ด ํ‘œํ˜„๋ ฅ ๋†’์ด๊ธฐ

go

const go = (...args) => reduce((a, f) => f(a), args);

go(
    0,
    a => a + 1,
    a => a + 10,
    a => a + 100,
    log
);
// 111

go(
    products,
    products => filter(p => p.price < 20000, products,
    products => map(p => p.price, products),
    prices => reduce(add, prices),
    log);
)
// ์œ„ ์ค‘์ฒฉ๋œ ์ฝ”๋“œ๋ฅผ ์ฝ๊ธฐ ์‰ฝ๋„๋ก ๊ฐœ์„ 

go(
    products,
    filter(p => p.price < 20000),
    map(p => p.price),
    reduce(add),
    log);
)
// curry๋ฅผ ํ†ตํ•ด ๋ณด๋‹ค ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ฐœ์„ (filter, map, reduce์— curry์ ์šฉ)

pipe

const pipe = (...fs) => (a) => go(a, ...fs);

const f = pipe(
    a => a + 1,
    a => a + 10,
    a => a + 100,
);
log(f(0));
// 111

curry

const curry = f =>
    (a, ..._) => _.length ? f(a, ..._) : (..._) => f(a, ..._);
// ํ•จ์ˆ˜๋ฅผ ๋ฐ›์•„์„œ ํ•จ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•˜๋Š”๋ฐ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์—ˆ์„ ๋•Œ
// ์ธ์ž๊ฐ€ ๋‘๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ๋ฐ›์•„๋‘” ํ•จ์ˆ˜๋ฅผ ์ฆ‰์‹œ์‹คํ–‰ํ•˜๊ณ 
// ํ•œ๊ฐœ๋ผ๋ฉด ํ•จ์ˆ˜๋ฅผ ๋‹ค์‹œ ๋ฆฌํ„ดํ•œ ํ›„์— ์ดํ›„์— ๋ฐ›์€ ์ธ์ž๋ฅผ ํ•ฉ์ณ์„œ ์‹คํ–‰ํ•˜๋Š” ํ•จ์ˆ˜

const mult = curry((a, b) => a*b);
log(mult(1)(3));
// 3

const mult3 = mult(3);
log(mult3(10));
log(mult3(5));
log(mult3(3));
// 30 15 9

ํ•จ์ˆ˜ ์กฐํ•ฉ์œผ๋กœ ํ•จ์ˆ˜ ๋งŒ๋“ค๊ธฐ

const total_price = pipe(
    map(p => p.price),
    reduce(add));

const base_total_price = predi => pipe(
    filter(predi),
    total_price);

go(
    products,
    base_total_price(p => p.price < 20000),
    log);
)

Last updated