我正在学习迭代器/生成器,并且想知道是否有一种方法可以使迭代器重设自身?就像当您调用最后一个.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中,我还使用生成器编写了迭代器,无论如何,在通过数组屈服之后还能够将其重置为第一个吗?
答案 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 };
}
}
}