Iterator Help 迭代器
内存占用
- 原始的处理数据方法内存分析
假设数据的长度无限长,那么一定会 oom
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const result = data.filter((it) => it).map((it) => it * 2);
迭代器示例
const data = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
const result = data
.values()
.filter((it) => it)
.map((it) => it * 2)
.take(data.length)
.toArray();
const w = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(
w
.values()
.filter((it) => it > 8)
.take(2)
.toArray(),
);
- 发现问题了吗?如果符合的数据在数组的最后两条。那么仍然要完整的走完全部的流程。时间复杂度是一样的。
但是,对空间复杂度上,是不会滚雪球的。因为 map 和 filter 会产生中间数组,尤其是map,在执行时,发现原始数组的length 为多少,就会先开辟一个新的数组,内存长度为原始数组的长度。在程序执行过程中,把符合的数据放到中间数组中去。(也就是说,在执行阶段,中间数组就产生了一直到程序执行完成)Iterator 不会,其只会在执行完成后产生一个新的数组。在程序执行时,不会产生中间数组。
const w = [1, 2, 3, 4, 5, 6, 7, 8, { a: 1 }, { b: 2 }];
const qq = w
.values()
.filter((it) => it instanceof Object)
.take(2)
.toArray();
w.at(-1).b = "12312312";
console.log(qq, w);
时间复杂度和空间复杂度
[1, 2, 3, 4, 5].filter((it) => it > 2);
[1, 2, 3, 4, 5].values().filter((it) => it > 2);
[1, 2, 3, 4, 5].values().filter((it) => it > 2);