Javascript 在node.js中为数组创建自定义迭代器有什么意义吗?

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

我需要解析一个80GB+CSV文件,并认为这是一个很好的机会来理解JavaScript中的迭代器(然后可能会使用现有的库,例如,等等)

查看MDN上的迭代器示例,我看到以下代码:

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:Basic
for
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) {
      ...
    })