【问题标题】:ES6 for of with keys and generator带有键和生成器的 ES6
【发布时间】:2018-12-03 15:57:59
【问题描述】:

如果我有一个数组:

[1, 2, 3, 4, 5] - 

我可以循环:

for (let [i, x] of arr.entries()){..}

如果我有生成器函数:

function* g() {
   yield 1; yield 2; yield 3;
}

我不能。

所以问题是如何使用 for 和生成器获取循环的索引和键。

常规数组和生成器的语法是否相同。

最后为什么生成器没有方法“条目”,因为它们都是可迭代的。

如果以不同的方式访问它们,那么可迭代的意义何在。

【问题讨论】:

  • 参见stackoverflow.com/questions/10179815/…,“对于一般的可迭代对象”。 entries() 用于类似地图的东西,而生成器不是(你不能这样做g()[0])。
  • 生成器不会创建整个数组。每次调用 next 时,它们都会运行该函数的另一次迭代。生成器通常是无限的。这就是 entries 函数对您的代码来说不够好的原因之一。

标签: javascript


【解决方案1】:

实际上,生成器的工作方式与普通的可迭代数据数据结构有点不同。 如果您想从某个生成器中获取索引和值,只是为了好玩,如果您生成的内容确实有索引,则可以。你不能产生任何你需要的东西。

function* gen() {
 const a = [3, 5, 6];
  for (let  [key, value] of a){
   yield [key, value];
  }
}

for (let [i, x] of gen()){
  console.log(i, x);
}

【讨论】:

【解决方案2】:

您基本上想在生成器上使用Array.prototype.entries,但那样不行。

但是,您可以轻松地将生成器转换为数组,然后然后使用entries 方法:

function* g() {
  yield 1; yield 2; yield 3;
}

for (let [i, x] of [...g()].entries()){..}

【讨论】:

  • 一旦生成器被转换为数组只是为了迭代(在大多数情况下,这是不可能的,因为生成器可以是无限的),恕我直言,生成器的点就丢失了。
  • 完全正确。那么使用生成器有什么用:P
  • 这是一个完美的有效场景(见developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…,基本相同); if 我们想使用像entries 这样的方法,这是最可行的选择。否则,我完全同意最初的问题是有缺陷的,因为生成器具有不同的数据结构,它们应该以不同的方式使用。
  • 与平面数组相比,使用生成器的意义在于多个。您不必预先计算所有内容(而不是数组),但仅在调用生成器时:您可能希望获得生成器的“快照”以进行迭代,而不是“活的” list”(例如静态节点列表和实时 htmlcollection 的区别)等。
猜你喜欢
  • 2016-09-10
  • 2016-06-24
  • 2018-04-14
  • 2019-05-12
  • 1970-01-01
  • 2011-11-02
  • 2017-08-16
  • 2016-07-11
  • 2017-01-10
相关资源
最近更新 更多