gpt4 book ai didi

javascript - 组合生成器

转载 作者:搜寻专家 更新时间:2023-11-01 05:28:42 27 4
gpt4 key购买 nike

鉴于以下情况。我想懒惰地将 transform 应用于从 Object.keys 返回的 iterable 的每个成员。

我该怎么做?

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
}

最佳答案

由于您很高兴将转换传递给 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
}

Live on 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
}

Live on Babel's REPL .


我们可以在那里分离出 numbers 的两个方面,并有一个通用的 transform 函数,它基本上是 map 的生成器版本:

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

然后我们可以在更基本的数字上使用它:

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
}

On Babel's REPL


旁注:我确定知道这一点,但是对于任何潜伏者,问题中的数字 [以及下面的几个] 迭代了一系列字符串:“0”“1” 等。但是当我们与它们相乘时,它们会被强制转换为数字。要根据问题的 numbers 方法实际得到一系列数字,我们需要

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

关于javascript - 组合生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41366737/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com