์ค๋์ ์ง์ฐ์ฑ์ ํ๋น ๋น ์ ธ๋ ๋ ์ด๋ค...
๋ญ๊ฐ ์ดํด๋ ๋ฏ ์๋ ๋ฏ ๊ทธ๋ฐ ๊ธฐ๋ถ์ด๋ค...๊ทธ๋์ ๋ญ๊ฐ ๋ ๋ต๋ตํ๋ค...๊ทธ๋๋ ์ฌ๋ฏธ๋ ์๋ค!!
๊ณ์ํด์ ๊ณผ์ ๋ฅผ ์๋ํด๋ณด๊ณ ์์ผ๋ ์ญ์๋ ์ด๋ ต๋ค ๐ข
๊ทธ๋๋ ์ค๋ ์คํฐ๋ ์ค๋น๋ ๋๋ด๊ณ ๊ฐ์๋ ์๊ฐํ๋ค.
์๋ง ์ฃผ๋ง์ ๋ณต์ต์ ์ด์ฌํ ํด์ผํ ๊ฒ ๊ฐ๋ค.
์ง์ฐ ํ๊ฐ์ ๊ฐ๋ ์ ์ดํด๊ฐ ๊ฐ๋๋ฐ ๋ง์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ ์ด๋ ต๋ค.
์ดํฐ๋ฌ๋ธ ์ค์ฌ ํ๋ก๊ทธ๋จ์์์ ์ง์ฐ ํ๊ฐ(Lazy Evaluation)
1. range์ L.range
2. map๊ณผ L.map
3. filter์ L.filter
4. flatten๊ณผ L.flatten
5. flatMap๊ณผ L.flatMap
์ค๋์ range์ L.range์ ๋น๊ต๋ฅผ ํตํด ์ง์ฐ ํ๊ฐ๋ฅผ ๋ณต์ตํด๋ณด๊ณ ์ ํ๋ค.
// ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ ํตํ range ๊ตฌํ
const range = l => {
let i = -1;
let res = [];
while(++i < l) {
res.push(i)
}
return res;
};
console.log(range(5)); // [0, 1, 2, 3, 4]
let list = range(4);
// ์ด๋ฏธ list๋ผ๋ ๊ฐ์ด ๋ฐฐ์ด์ธ ์ํ, ์์ ํ ํ๊ฐ ์๋ฃ
console.log(list); // [0, 1, 2, 3]
// ๋๊ธํ L.range ๊ตฌํ
const L = {};
L.range = function *(l){
let i = -1;
while(++i < l) {
yield i;
}
};
let list = L.range(4);
console.log(list); // ์์ง ํ๊ฐ๊ฐ ๋์ด์์ง ์์ ์ํ
console.log(list.next()) // {value: 0, done: false}
console.log(list.next()) // {value: 1, done: false}
console.log(list.next()) // {value: 0, done: false}
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ด ๋์จ๋ค.
L.range๋ ์ ๋๋ ์ดํฐ ํจ์๋ก ์ดํฐ๋ฌ๋ธ/์ดํฐ๋ ์ดํฐ๋ฅผ ์์ฑํด์ค๋ค.
๋ฐ๋ผ์ list๋ฅผ ์ถ๋ ฅํ์ ๋, list๋ ์์ง ํ๊ฐ๋์ง์์ ์ํ๋ก next()๋ฅผ ํธ์ถํ๋ ์์ ์ ํ๊ฐ๋์ด ๊ฐ์ ์ถ๋ ฅํด์ค๋ค.
range
- range(4)๊ฐ ์คํ๋ ์์ ์์ ์ด๋ฏธ [0, 1, 2, 3]์ ๋ฐฐ์ด๋ก ์์ ํ ํ๊ฐ ์๋ฃ
L.range
- L.range(4)๋ก ์์ฑ๋ ์ดํฐ๋ ์ดํฐ๋ฅผ next()๋ก ์ํํ ๋๋ง๋ค ํ๋์ฉ ๊ฐ์ด ํ๊ฐ (์ง์ฐ ํ๊ฐ)
// range์ L.range ์ฑ๋ฅ ํ
์คํธ
function test(name, time, f) {
console.time(name);
while (time--) f();
console.timeEnd(name);
}
test('range', 10, () => reduce(add, range(1000000)));
test('L.range', 10, () => reduce(add, L.range(1000000)));
ํฐ ์ฐจ์ด๋ ์๋์ง๋ง, L.range๊ฐ ๋ ํจ์จ์ ์ด๋ผ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
์ง์ฐ ํ๊ฐ์ ๋ํ ๊ฐ๋
์ ์ฒ์ ๋ฐฐ์ฐ๊ณ ์ดํดํด๋ณด๋ ๋๊ฒ ์ ๊ธฐํ๋ค.
๊ทธ์ ๋ฐฐ์ด์ ๋ฉ์๋๋ก ํจ์๋ค์ ์ฐ๊ธฐ๋ง ํ์ง ์ด๋ ๊ฒ ํจ์ํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ์ ๊ทผํด๋ณด๋ ์๋ก์ด ๊ฒ๋ค์ ๋ง์ด ๋ฐฐ์ธ ์ ์์๋ค.
๊ณผ์ ์๋ ์ ์ ์ฉํด์ ๋ง์คํฐํ๋๋ก,,, ๋
ธ๋ ฅํด๋ด์ผ๊ฒ ๋ค ~ ๐ช