考虑到以下几点。我想懒散地将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
}发布于 2016-12-28 17:23:15
由于您很高兴将转换传递到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's 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
}
我们可以将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
}
附带注意:我相信你知道这一点,但是对于任何潜伏者,问题中的numbers和下面的几个字符串都是在一系列字符串上迭代的:"0","1"等等。但是当我们用它们相乘时,它们会被强迫成数字。要根据问题的numbers方法得到一系列数字,我们需要
yield* Object.keys([...Array(upto)]).map(Number));发布于 2016-12-29 10:36:50
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
}
https://stackoverflow.com/questions/41366737
复制相似问题