Javascript 在node.js中为数组创建自定义迭代器有什么意义吗?
我需要解析一个80GB+CSV文件,并认为这是一个很好的机会来理解JavaScript中的迭代器(然后可能会使用现有的库,例如,等等) 查看MDN上的迭代器示例,我看到以下代码:Javascript 在node.js中为数组创建自定义迭代器有什么意义吗?,javascript,iterator,Javascript,Iterator,我需要解析一个80GB+CSV文件,并认为这是一个很好的机会来理解JavaScript中的迭代器(然后可能会使用现有的库,例如,等等) 查看MDN上的迭代器示例,我看到以下代码: function makeIterator(array) { var nextIndex = 0; return { next: function() { return nextIndex < array.length ? {va
function makeIterator(array) {
var nextIndex = 0;
return {
next: function() {
return nextIndex < array.length ?
{value: array[nextIndex++], done: false} :
{done: true};
}
};
}
然后我可以使用我闪亮的新迭代器“迭代地”提取数组中的值:
var val0 = iteratorForMyArray.next().value
var val1 = iteratorForMyArray.next().value
etc
我可以理解为什么这在解析CSV文件时很有用。我想知道为一个简单数组创建这样一个迭代器是否有意义
我经常发现,虽然简化的示例有助于理解,但有时很难看出示例仅在示例vs在编程中实际有用时才有用
因为JavaScript已经提供了两种在数组结构上创建迭代器的机制:
1:Basicfor
loop
(我刚才看到的是现场速度很慢)
问题:
ForEach保证顺序,并且它将跳过无效的索引等。与标准for循环相比,迭代器没有提供任何额外的功能,它只会更慢,因为您正在调用函数以获取下一项,而基本for循环没有这种开销。使用for循环并缓存开始时的长度以获得更好的性能 迭代器的一个很好的特性是,每次调用都会得到下一个元素,而forEach要么全是,要么什么都不是(您不能提前退出),对于for循环和forEach,所有逻辑都必须在循环内 考虑一个数组迭代器,如:
函数数组迭代器(数组){
//将数组索引作为数组获取
变量索引=Object.keys(数组)
.过滤器(
//测试有效的数组索引属性
key=>key==+key&&key>=0&&key.length==String(+key.length)
//按数字排序
.sort(函数(a,b){返回a-b});
//闭包中的参数
无功电流=0;
var计数=0;
var maxCount=index.length;
//返回迭代器函数
返回函数(){
return++count>maxCount?'done':数组[索引[当前+++];
};
}
var-arr=[0,1,4,5,6];
//添加非索引数字属性
arr['01']='01';
//添加可索引的数值属性
arr['10']='10';
//添加一些其他属性
arr.foo='foo';
var x=阵列迭代器(arr);
console.log(x());//0
console.log(x());//1.
console.log(x());//4.
console.log(x());//5.
console.log(x());//6.
console.log(x());//10
console.log(x());/'完成
console.log(x());/'完成“
您提到.forEach()
速度慢,但这是因为它在每次迭代时调用一个函数,您的自定义迭代器也会这样做。无论如何,如果您打算一次迭代整个数组,比如for
循环或.forEach()
,那么定制迭代器就没有意义了,它只会使代码更难阅读。如果您的目的是能够逐渐地迭代它,比如说,为了响应某个异步事件而获取下一个或两个元素,或者从代码中的多个位置获取下一个或两个元素,然后一个自定义迭代器可能有助于跟踪您所使用的元素。不过,还有其他一些方法可以降低循环迭代的速度,这些方法不涉及自定义迭代器,而且可能也很容易阅读(我认为),有一个数组迭代器可以在不受forEach限制的情况下完成这两项工作,这是非常容易的。
var val0 = iteratorForMyArray.next().value
var val1 = iteratorForMyArray.next().value
etc
for (let i = 0, i < [1,2,3,4,etc]; i++) {
...
}
[1,2,3,4,etc].forEach(function(val, i, arr) {
...
})