鉴于以下。我想懒洋洋地向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
}
由于很高兴将转换传递到中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
}
我们可以分离出这两个方面,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));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句