Skip to content

Latest commit

ย 

History

History
92 lines (72 loc) ยท 2.36 KB

File metadata and controls

92 lines (72 loc) ยท 2.36 KB

flatten๊ณผ flatMap

ํ•จ์ˆ˜ํ˜• ๊ฐ•์˜ ์„น์…˜7 ๋‚ด์šฉ ์ •๋ฆฌ - 3
(๊ฐ•์˜๋ช…: ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ๊ณผ JavaScript ES6+ ์œ ์ธ๋™ ๊ฐ•์‚ฌ๋‹˜)

flatten ํ•จ์ˆ˜

  • L.flatten ํ•จ์ˆ˜: ๋™์ ์œผ๋กœ ํ•œ๋ฒˆ์— ํŽผ์ณ์„œ ํ•œ ๋ށ์Šค๋ฅผ ๊ฐ€์ง„ ์ผ์ •ํ•œ ๋ฐฐ์—ด๋กœ ๋ณ€ํ˜•ํ•ด์ฃผ๋Š” ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋ฅผ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜
  • flatten ํ•จ์ˆ˜: ์ฆ‰์‹œ ๋ชจ๋‘ ํ‰๊ฐ€ํ•˜๋Š” ํ•จ์ˆ˜
์ด๋Ÿฐ ๊ฐ’์ด ์žˆ์„๋•Œ 
[[1,2], 3, 4, [5,6], [7,8,9]]

๊ฐ’์„ ๋‹ค ํŽผ์ณ์„œ ํ•˜๋‚˜์˜ ๋ฐฐ์—ด๋กœ ๋งŒ๋“œ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค. 
[...[1,2], 3, 4, ...[5,6], ...[7,8,9]]
// [1,2,3,4,5,6,7,8,9]

L.flatten ํ•จ์ˆ˜

flatten์˜ ์ง€์—ฐํ•จ์ˆ˜

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

L.flatten = function *() {
    for (const a of iter) {
        if (isIterable(a)) {
            // a์•ˆ์— ์žˆ๋Š” ๊ฐ’๋“ค์„ ๋ฝ‘์•„ ๋ชจ๋‘ yield
            for (const b of a) yield b;
        } else {
            yield a;  
        } 
    }
};

var it = L.flatten([[1, 2], 3, 4, [5, 6], [7, 8, 9]]);
log(it.next());
log(it.next());

// ๋‹ค๋ฝ‘์Œ
log([...it]);

flatten ํ•จ์ˆ˜

const flatten = pipe(L.flatten, takeAll);
log(flatten( [[1,2],3,4,[5,6],[7,8,9]] ));

flatMap ํ•จ์ˆ˜

flatMap์€ map๊ณผ flatten์„ ๋™์‹œ์— ํ•˜๋Š” ํ•จ์ˆ˜

// flatMap์€ ์ธ์ž์— ์ „๋‹ฌ๋œ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ ๋ฐฐ์—ด ์›์†Œ์˜ ๊ฐ’๋“ค์— ๋ณ€ํ™”๋ฅผ ์ค˜์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ
// ์•ˆ์ชฝ์— ์žˆ๋Š” ๋ฐฐ์—ด ์›์†Œ์˜ ๊ฐ’ ํ•˜๋‚˜ํ•˜๋‚˜ ํ•จ์ˆ˜ ์ ์šฉ
([[1,2], [3,4], [5,6,7], 8,9, [10]]).flatMap(a => a.map(a => a*a)));
// --> ๊ฒฐ๊ตญ map์„ ํ•˜๊ณ  flatten์„ ํ•œ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘

L.flatMap

flatMap์˜ ์ง€์—ฐํ•จ์ˆ˜

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

flatMap

์ฆ‰์‹œ ํ‰๊ฐ€ํ•œ flatMap

const flatMap = pipe(L.flatMap, takeAll);
const flatMap = curry(pipe(L.map, L.flatten, takeAll));
const flatMap = curry(pipe(L.map, flatten)); // flatten์—์„œ ๋ชจ๋“ ํ‰๊ฐ€๋ฅผ ์™„๋ฃŒํ•œ flatMap์„ ๋งŒ๋“ฆ

์‘์šฉ

flatMap(range, map(a => a+1, [1,2,3]));

...L.flatMap(L.range, map(a => a+1, [1,2,3]));

flatMap(L.range, map(a => a+1, [1,2,3]));// ์ฆ‰์‹œํ‰๊ฐ€๋˜๋Š” flatMap ์‚ฌ์šฉ

// ์ดํ„ฐ๋ ˆ์ดํ„ฐ๋กœ ๋งŒ๋“  ํ›„ next๋กœ ํ•„์š”ํ• ๋•Œ๊นŒ์ง€๋งŒ ์ˆœํšŒ
var it = L.flatMap(L.range, map(a => a+1, [1,2,3]));
it.next();
it.next();
it.next();

// take๋กœ ์•ž์—์„œ 3๊ฐœ๋งŒ ๊บผ๋‚ด์„œ ๋ณด๊ฒ ๋‹ค
take(3, L.flatMap(L.range, map(a => a+1, [1,2,3])))