组成发电机

我是阿斯顿

鉴于以下。我想懒洋洋地向transform从返回的可迭代对象的每个成员申请Object.keys

我怎样才能做到这一点?

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
}
TJ人群

由于很高兴将转换传递到中numbers,因此可以充分利用numbers生成器的优点在生成时应用它

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的REPL上直播


我们可以使用的原始定义numbers,但是我们要么急切地应用转换,而不是懒惰地应用转换,要么我们必须使用数组的迭代器(无论如何,数组都将立即创建)。这是后一个:

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的REPL上


我们可以分离出这两个方面,numbers并具有一个通用transform功能,基本上是的生成器版本map

function* transform(iterable, f) {
  for (const v of iterable) {
    yield f(v);
  }
}

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

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方法实际获得一系列数字,我们需要

yield* Object.keys([...Array(upto)]).map(Number));

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章