首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >合成发电机

合成发电机
EN

Stack Overflow用户
提问于 2016-12-28 17:13:51
回答 2查看 591关注 0票数 4

考虑到以下几点。我想懒散地将transform应用于从Object.keys返回的可迭代的每个成员。

我该怎么做?

代码语言:javascript
复制
function* numbers(upto, transform) { 
  yield* Object.keys([...Array(upto)]); // How can `transform` be applied here lazily?
}

function timesTwo(n) {
    return n*2;
}

var generator = numbers(31, timesTwo)

for(var i of generator) {
    console.log(i); // 0 2 4 6 8... 60
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-28 17:23:15

由于您很高兴将转换传递到numbers中,所以如果您利用numbers作为生成器的优势,就可以在生成时应用它:

代码语言:javascript
复制
function* numbers(upto, transform) { 
  let n = 0;
  while (n < upto) {
      yield transform(n);
      ++n;
  }
}

const timesTwo = n => n * 2;

const generator = numbers(31, timesTwo);

for (const i of generator) {
    console.log(i); // 0 2 4 6 8... 60
}

在Babel's REPL上直播适用于浏览器不会运行上述内容的用户。

我们可以使用numbers的原始定义,但是我们要么必须急切地应用转换,而不是懒洋洋地应用,要么就必须使用数组的迭代器(不管什么情况下,数组都会同时创建)。这是后一个:

代码语言:javascript
复制
function* numbers(upto, transform) { 
  for (const n of Object.keys([...Array(upto)])) {
    yield transform(n);
  }
}

const timesTwo = n => n * 2;

const generator = numbers(31, timesTwo);

for (const i of generator) {
    console.log(i); // 0 2 4 6 8... 60
}

在Babel's REPL上直播

我们可以将numbers的两个方面分开,并有一个通用的transform函数,它基本上就是map的生成器版本。

代码语言:javascript
复制
function* transform(iterable, f) {
  for (const v of iterable) {
    yield f(v);
  }
}

然后我们可以在一个更基本的numbers上使用它。

代码语言:javascript
复制
function* transform(iterable, f) {
  for (const v of iterable) {
    yield f(v);
  }
}

function* numbers(upto) { 
  yield* Object.keys([...Array(upto)]);
}

const timesTwo = n => n * 2;

const generator = transform(numbers(31), timesTwo);

for (const i of generator) {
    console.log(i); // 0 2 4 6 8... 60
}

论Babel的REPL

附带注意:我相信你知道这一点,但是对于任何潜伏者,问题中的numbers和下面的几个字符串都是在一系列字符串上迭代的:"0""1"等等。但是当我们用它们相乘时,它们会被强迫成数字。要根据问题的numbers方法得到一系列数字,我们需要

代码语言:javascript
复制
yield* Object.keys([...Array(upto)]).map(Number));
票数 6
EN

Stack Overflow用户

发布于 2016-12-29 10:36:50

代码语言:javascript
复制
function lazy(f) {
    return function*(iter) {
        for(const v of iter) {
            yield f(v);
        }
    }
}

function* numbers(upto, transform) { 
    yield* lazy(transform)(Object.keys([...Array(upto)]));
}

function timesTwo(n) {
    console.log('times two called on ', n);
    return n*2;
}

var generator = numbers(11, timesTwo)

for(var i of generator) {
    console.log(i); // 0 2 4 6 8... 20
}

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41366737

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档