Ben*_*Ben 4 javascript generator
鉴于以下内容.我想懒惰地应用于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
}
Run Code Online (Sandbox Code Playgroud)
由于您很高兴将变换传入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
}Run Code Online (Sandbox Code Playgroud)
对于那些浏览器无法运行上述内容的人,请使用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
}Run Code Online (Sandbox Code Playgroud)
我们可以将那里的两个方面分开,numbers并且具有通用transform功能,基本上是以下的生成器版本map:
function* transform(iterable, f) {
for (const v of iterable) {
yield f(v);
}
}
Run Code Online (Sandbox Code Playgroud)
然后我们可以使用更基本的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
}Run Code Online (Sandbox Code Playgroud)
附注:我敢肯定,你知道这一点,但对于任何潜伏的numbers问题中[和他们夫妇下文]迭代一系列的字符串:"0","1",等.但是当我们与他们乘,他们得到裹挟数字.要根据问题的numbers方法实际获得一系列数字,我们需要
yield* Object.keys([...Array(upto)]).map(Number));
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
404 次 |
| 最近记录: |