如何重置迭代器?

sam*_*pls 4 javascript iterator

我正在学习迭代器/生成器,并且想知道是否有办法使迭代器自行重置?就像在你调用最后一个之后.next()有没有办法让它重新启动?

function nextName() {
   const current = names.next().value
  const output = document.querySelector("output")
  if (current) { 
      output.innerText = current.name
    } 
    else { 
     // code to reset it! currently I'm just displaying text
     output.innerText = 'Nothing left'
     }
}

function nameIterator(names) {
  let nextIndex = 0;
  return {
    next: function() {
      return nextIndex < names.length ? 
        { value: names[nextIndex++], done: false } :
        { done: true }
     }
  }
}
Run Code Online (Sandbox Code Playgroud)

这是一个更清晰的代码笔: https://codepen.io/sammiepls/pen/romyKL?editors =1010

因此,当您单击该按钮时,它会调用我的迭代器,每次您单击时,它将一一显示我的名称数组中的名称。如何使其在最后一次单击时重置,以便返回到名字?

所以显示会是这样的:

鲍勃

彼得

莎莉

Bob // 再次获取 Bob

在codepen中,我还使用生成器编写了迭代器,无论如何,在通过数组产生之后,是否也能够重置回第一个迭代器?

Mad*_*iha 5

一般的答案是你不能在 JS 中重置可迭代对象。据我所知,这是设计使然,尽管我不了解得出该结论的决策过程。

然而,在您的特定情况下,您不一定需要重置迭代器,而是希望循环遍历数组。在这种情况下,您可以使用模运算符,如下所示:

function nameIterator(names) {
  let nextIndex = 0;
  return {
    next: function() {
      nextIndex = (nextIndex + 1) % names.length;
      return { value: names[nextIndex], done: false };
    }
  }
}
Run Code Online (Sandbox Code Playgroud)