javascript - 如何在 JavaScript 中使自定义迭代器接口(interface)可迭代

标签 javascript iterator

我有一个数组,并且我已经覆盖了它的默认迭代器行为。问题是,重写后,返回的迭代器变得不可迭代,并且 for..of..loop 失败,但对数组有效,但对数组的迭代器 next() 方法的显式调用仍然有效。下面是代码:

let arr = ["A", "B", "C", "D", "E", "F"];
arr[Symbol.iterator] = function(){
  let i = 0;

  return {
    //Iterator interface
    next:function(){
      //IteratorResult Interface
      return {
        value: arr[i++]+"..",
        done: arr[i] == undefined?true:false
      }
    }
  }
}

这是迭代器对象

let arrIterator = arr[Symbol.iterator](); //An iterator object returned but not iterable

在迭代器对象上使用 for..of..loop 进行消费试验

for (let i of arrIterator){
  console.log(i);
}

输出

for..of..loop trial on iterator result

在数组上使用 for..of..loop 进行消费试验

for (let i of arr){
  console.log(i);
}

输出

for..of..loop trial on array result

使用显式 next() 方法调用进行消费试验

console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());
console.log(arrIterator.next());

输出

explicit next() method call on iterator result

我真的很想知道如何使自定义迭代器可迭代以供 for..of..loop 使用。

谢谢

最佳答案

您还需要实现 Iterable 协议(protocol)(而不仅仅是 Iterator)

添加[Symbol.iterator]: function() { return this; } 到你的 Iterator 对象中,它就会工作。

let arr = ["A", "B", "C", "D", "E", "F"];
arr[Symbol.iterator] = function() {
  let i = 0;

  return {
    //Iterator interface
    next: function() {
      //IteratorResult Interface
      return {
        value: arr[i++] + "..",
        done: arr[i] == undefined ? true : false
      }
    },
    // Iterable interface
    [Symbol.iterator]: function() {
      return this;
    }
  }
}

let arrIterator = arr[Symbol.iterator](); //An iterator object returned but not iterable

for (let i of arrIterator) {
  console.log(i);
}

参见Iteration protocols了解更多信息

关于javascript - 如何在 JavaScript 中使自定义迭代器接口(interface)可迭代,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61234765/

相关文章:

javascript - 如何使用 jQuery 查找 parent 的 child ?

Javascript - 如何获取文本框中的字符数并使用子字符串删除

c++ - 我如何编写一个迭代器包装器来组合来自底层迭代器的顺序值组?

jsp - Struts2 - 另一个属性内的属性标记

c++ - Qt:为模板构造一个可变迭代器(映射、列表、集合……)

javascript - Chrome 的 toLocaleFormat 的替代品是什么?

javascript - 同级别对象的组数组

c++ - 如何为合成数据创建迭代器?

javascript - JS 生成 HTML 表格,但第一行单元格无法获取值,显示为 'undefined'

java - 如何计算位于给定数组的两个元素之间的数组元素的数量