【问题标题】:Using functional for loop with non-Array iterator使用具有非数组迭代器的功能性 for 循环
【发布时间】:2017-11-19 07:41:29
【问题描述】:

假设我们有这个生成器函数(生成器 fn 返回一个迭代器):

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

for (let i of foo()) {
  console.log(i);
}

我们可以使用for..of 循环遍历迭代器。

我的问题是:有没有办法创建一个函数式 for 循环来像使用数组一样迭代迭代器?

[1,2,3].forEach(function(i){
   // we have our own block scope for each item in the iterable
});

我们最好的选择是这种技术吗?

 for (let i of foo()) {
      (function(i){

      })(i);
 }

看来一定有更简单的方法

【问题讨论】:

  • Array.from(...iterable...).forEach(),也许吧?
  • 你知道let有一个block scope
  • WTH 是“函数式for循环”吗?你有什么问题for (let i of foo())没有解决?
  • Functional for-loop 是一个包罗万象的短语,用于循环结构,如 map / filter / forEach。
  • 但是是的,我对for..of 不是很熟悉,但也许它适用于块范围的 let 变量 - 直到你转换为 es5 :)

标签: javascript node.js


【解决方案1】:

[...foo()].forEach 应该是最接近的。

一个更大的问题是为什么 javascript 不为生成器/Iterables 提供类似数组的函数。

【讨论】:

【解决方案2】:

您可以使用Array.from的第二个参数,这是一个类似地图的回调函数:

Array.from(foo(), value => console.log(value));

function* foo(){
  yield 1;
  yield 2;
  yield 3;
}
Array.from(foo(), value => console.log(value));

【讨论】:

  • 是的,如果没有更好的我想我会用这个
【解决方案3】:

TypeScript 是如何转译的:

之前

const iterator = [1,2,3];

for (let o of iterator) {
  console.log(o);
}

之后

var iterator = [1, 2, 3];
for (var _i = 0, iterator_1 = iterator; _i < iterator_1.length; _i++) {
    var o = iterator_1[_i];
    console.log(o);
}

下面是 TypeScript 是如何转译的:

之前

const iterator = [1,2,3];

Array.from(iterator).forEach(function(o){
  console.log(o);
});

之后

var iterator = [1, 2, 3];
Array.from(iterator).forEach(function (o) {
    console.log(o);
});

只是想一想

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 2012-11-28
    • 2016-08-27
    • 2015-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多