L.range = function* (l) {
let i = -1;
while (++i < l) {
//제네레이터로 생성
yield i;
}
return res;
};
console.time('');
console.log(take(5, range(Infinity)));
console.timeEnd('');
//아래는 똑같이 5만큼만 시간이 들지만 위는 브라우저가 감당하지 못함
console.time('');
console.log(take(5, L.range(Infinity)));
console.timeEnd('');
L.map = function *(f, iter) {
for (const a of iter) yield f(a);
};
var it = L.map(a => a + 10, [1, 2, 3]);
L.filter = function *(f, iter) {
for (const a of iter) if (f(a)) yield a;
};
var it = L.filter(a => a % 2, [1, 2, 3, 4]);
아래의 예시는 100000개의 배열을 선언하고, 그 이후에 순차적으로 map filter 등을 실행하므로 효율이 매우 낮음
Array(100000).fill().map((v, i) => i)
.map((v) => v + 1)
.filter((v) => v % 3 === 0)
.slice(0, 10);
지연 평가의 예시
lodash의 range를 이용해 구현하면, 자동으로 lodash가 지연 평가를 해주므로, 매번 실행 시에 map과 filter slice를 실행하고 지연 평가를 위해value()를 실행한다.
_().range(100001)
.map((v) => v + 1)
.filter((v) => v % 3 === 0)
.slice(0, 10)
.value();
출처: (https://www.zerocho.com/category/JavaScript/post/5c0cb264f82a70001e47db0c)