ES6+ Basic4

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

๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ํ•จ์ˆ˜ reduce, take

  • ์‹ค์ œ๋กœ ์—ฐ์‚ฐ์„ ์‹œ์ž‘ํ•˜๋Š” ์‹œ์ž‘์ ์„ ์•Œ๋ฆฌ๋Š” ํ•จ์ˆ˜

reduce

L.entries = fuction *(obj) {
    for (const k in obj) yield [k, obj[k]];
};

// Array.prototype.join๋ณด๋‹ค ๋‹คํ˜•์„ฑ์ด ๋†’์€ joinํ•จ์ˆ˜
const join = curry((sep = ',', iter) =>
    reduce((a, b) => '${a}${sep}${b}', iter));

// const queryStr = obj => go(
//   obj,
const queryStr = pipe(
    L.entries,
    L.map(([k, v])=> '${k}=${v}'),
    join('&');

//    Object.entries,
//    map(([k, v])=> '${k}=${v}'),
//    reduce((a, b) => '${a}&${b}')
);

log(queryStr({ limit: 10, offset:10, type:'notice'}));

take, find

  • find๋Š” take๋ฅผ ํ†ตํ•ด ๊ฒฐ๋ก (๊ฒฐ๊ณผ)์„ ์ง€์–ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ

const users = [
    { age: 32 },
    { age: 43 },
    { age: 34 },
    { age: 25 },
    { age: 21 },
    { age: 38 },
    { age: 23 },
];

// ์ฒซ๋ฒˆ์งธ๋กœ ๋งŒ๋‚˜๋Š” 1๊ฐœ๋งŒ ๊บผ๋‚ด์ฃผ๋Š” ํ•จ์ˆ˜
const find = curry((f, iter) => go(
    iter,
    L.filter(f)
    take(1)
    ([a]) => a
));

log(find(u => u.age < 30, users ));

L.map + take๋กœ map ๋งŒ๋“ค๊ธฐ

const takeAll = take(Infinity);

L.map = curry(function *(f, iter) {
    for (const a of iter) {
        yield f(a);
    }
});

const map = curry(pipe(L.map, takeAll));

log(map(a => a + 10, L.range(4)));

L.filter + take๋กœ filter ๋งŒ๋“ค๊ธฐ

L.filter = curry(fuction *(f, iter) {
    for (const a of iter ) {
        if (f(a)) yield a;
    }
});

const filter = curry(pipe(L.filter, takeAll));

log(filter(a => a % 2, range(4)));

L.flatten

// ๋ฐ”๋กœ ํ‰๊ฐ€๋˜๋Š” flatten ํ•จ์ˆ˜
const flatten = pipe(L.flatten, takeAll);

const isIterable = a => a && a[Symbol.iterator];

// ๊นŠ์€ Iterable์„ ๋ชจ๋‘ ํŽผ์น  ๋•Œ
L.deepFlat = function*(iter) {
    for (const a of iter) {
        if (isIterable(a)) yield *f(a);
        else yield a;
    }
}

L.flatten = function *(iter) {
    for (const a of iter) {
        if (isIterable(a)) yield *a;
//        if (isIterable(a)) for (const b of a) yield b;
// yield *iterabel = for (const val of iterable) yield val;
        else yield a;
    }

var it = L.flatten([[1,2], 3, 4, [5, 6], [7, 8, 9]]);
log([...it]);
};
  • 1์ฐจ์› ๋ฐฐ์—ด๋กœ ๋งŒ๋“ค์–ด์ฃผ๋Š” ์ œ๋„ˆ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜

L.flatMap

// ๋‘ ๋ฐฉ๋ฒ•์€ ํฐ ์ฐจ์ด๊ฐ€ ์—†์Œ(๋˜‘๊ฐ™์ด ์ „๋ถ€ ์ˆœํšŒํ•˜๊ธฐ ๋•Œ๋ฌธ)
// ๊ธฐ์กด์˜ flatmap์€ array์—์„œ๋งŒ ๋™์ž‘ํ•จ
log([1, 2], [3, 4], [5, 6, 7].flatMap(a => a.map(a => a * a)));
log(flatten([1, 2], [3, 4], [5, 6, 7].map(a => a.map(a => a * a))));

L.flatMap = curry(pipe(L.map, L.flatten));

//์ฆ‰์‹œํ‰๊ฐ€
const flatMap = curry(pipe(L.map, flatten));

var if = L.flatMap(map(a => a * a), [[1, 2], [3, 4], [5, 6, 7]]);
log([...it]);

2์ฐจ์› ๋ฐฐ์—ด ๋‹ค๋ฃจ๊ธฐ

const arr = [
    [1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [9, 10]
];

go(arr,
    L.flatten,
    L.filter(a => a % 2),
    L.map(a => a * a),
    take(3),   
    reduce(add),
    log);

์ง€์—ฐ์„ฑ / ์ดํ„ฐ๋Ÿฌ๋ธ” ์ค‘์‹ฌ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์‹ค๋ฌด์ ์ธ ์ฝ”๋“œ ์˜ˆ์ œ

var users = [
    { name: 'a', age: 21, family: [
        { name: 'a1', age: 56 }, { name: 'a2', age: 70 },
        { name: 'a3', age: 15 }, { name: 'a4', age: 3 }
    ]},
    { name: 'b', age: 38, family: [
        { name: 'b1', age: 34 }, { name: 'b2', age: 5 }
    ]},
    { name: 'c', age: 31, family: [
        { name: 'c1', age: 68 }, { name: 'c2', age: 62 },
        { name: 'c3', age: 12 }
    ]},
    { name: 'd', age: 20, family: [
        { name: 'd1', age: 42 }, { name: 'd2', age: 42 },
        { name: 'd3', age: 11 }, { name: 'd4', age: 4 }
    ]},
]

go(users,
    L.map(u => u.family),
    L.flatten,
    L.filter(u => u.age < 20),
    L.map(u => u.name),
    take(4),
    log);

Last updated