【问题标题】:Is there a better way to find if an iterator has reached its last value?有没有更好的方法来确定迭代器是否达到了它的最后一个值?
【发布时间】:2019-04-12 22:55:02
【问题描述】:

我可以这样做:

let iter = mySet.values();
var val = iter.next();
var next = iter.next();
while(val.value){
  if(!next.done){
    // do something that I want to do to the last element
  }
  val = next;
  next  = iter.next();
}

但“下一个”变量似乎很笨拙。有没有更好的办法?

当我检查 mySet 对象时,我看到一个 [[Entries]] 键和一个值数组,但是我该如何访问它呢?

【问题讨论】:

  • 如果不需要知道索引,可以使用for..of循环
  • javascript 是否提供iterator.hasNext() 方法?从未在 javascript 中使用过它,但该方法在其他语言中提供。
  • mySet.value(); 那是一套吗?如果是这样,你的意思是.values()
  • @zfrisch 为什么 Set 会影响性能? Set.has() 比 Array.find 或 Array.some 或 indexOf 性能更高
  • @zfrisch 刚刚快速搜索并找到了一个有效的 jsperf jsperf.com/array-indexof-vs-set-has

标签: javascript iterator


【解决方案1】:

您可以使用while(!next.done),并且每次迭代只想使用一次next()

要确定它是否是最后一个值,请将值存储在变量中,然后重新分配next,然后在处理值之前检查done

function* myGen(arr) {
  let i = -1;
  while (++i < arr.length) {
    yield arr[i] * 2;
  }
}

const it = myGen([1, 2, 3]);

let next = it.next();

while (!next.done) {
  const val = next.value;
  next = it.next();
  console.log('value:', val, ' is last = ', next.done);
}

console.log('done:', next.done)

【讨论】:

  • 问题的重点是能够知道我们何时查看最后一个元素,并区别对待。
  • ok...简单修复...检查循环内的next.done 也是在新赋值之后,并首先将循环内的值存储在变量中。然后你可以使用值 after 检查完成和 while 循环关闭之前
  • 从我的方法中节省了 1 行;最初的 var val = iter.next(); 。感谢您的改进。但你是说,从根本上说,我仍然需要 2 个变量来查看我何时处于最后一个元素?
  • 看来你下一次打电话的次数太多了。是的....没有办法解决一个变量的值和一个变量的下一个对象
  • 实际使用的次数和你一样。
【解决方案2】:

来自 Mozilla 的Doc

"...next() 方法返回一个具有两个属性的对象:value,序列中的下一个值;和 done,如果序列中的最后一个值已经被消耗,则为 true。"

你的方法没有问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-21
    • 2020-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2011-02-20
    相关资源
    最近更新 更多