您如何重置迭代器?

时间:2018-12-23 14:26:06

标签: 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 }
     }
  }
}

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

因此,当您单击按钮时,它将调用我的迭代器,该迭代器将在每次单击时一一显示在我的名称数组中。我如何才能在最后一次点击时重置它,使其恢复为名字?

所以显示如下:

鲍勃

彼得

莎莉

鲍勃//重新获得鲍勃

在codepen中,我还使用生成器编写了迭代器,无论如何,在通过数组屈服之后还能够将其重置为第一个吗?

3 个答案:

答案 0 :(得分:1)

要解决此问题,请在迭代器完成后将其重置,如下所示:

// code to reset it!
output.innerText = 'Nothing left'
names = nameGenerator(arr);

除非有人证明我做错了,否则目前没有方法可以重置我知道的迭代器。

工作片段示例:

const arr = [ {name: "Bob"}, {name: "Peter"}, {name: "Sally"} ];

let names = nameGenerator(arr);


function nextName() {
   const current = names.next().value
  const output = document.getElementById("output")
   if (current) { 
      output.innerText = current.name
    } 
    else { 
    // code to reset it!
      output.innerText = 'Nothing left'
      names = nameGenerator(arr);
    }
}
  
function nameIterator(names) {
  let nextIndex = 0;
  return {
    next: function() {
      return nextIndex < names.length ? 
        { value: names[nextIndex++], done: false } :
        { done: true }
    }
  }
}

function* nameGenerator() {
  let index = 0;
  while(index < arr.length) {
    yield(arr[index++])
  }
}

 document.querySelector("button").addEventListener("click", nextName)
<button id="button">click me</button>
<p id="output"></p>

答案 1 :(得分:1)

如果索引大于数组索引,则可以更改索引并采用余数。

function nameIterator(names) {
    let nextIndex = 0;
    return {
        next: function() {
            nextIndex++;
            nextIndex %= name.length;
            return { value: names[nextIndex], done: false };
        }
    }
}

答案 2 :(得分:1)

普遍的回答是,您无法在JS中重置可迭代项。据我所知,这是设计使然,尽管我并不擅长决策流程用来得出这个结论。

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

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