我想根据 JavaScript 中生成器的值创建一个数组。 生成器创建一个像这样的动态长度的序列
function* sequenceGenerator(minVal, maxVal) {
let currVal = minVal;
while(currVal < maxVal)
yield currVal++;
}
我想将这些值存储在数组中,但使用
next()
直到生成器完成似乎不是最好的方法(说实话看起来很丑)。
var it, curr, arr;
it = sequenceGenerator(100, 1000);
curr = it.next();
arr = [];
while(! curr.done){
arr.push(curr.value);
}
我可以以某种方式直接从生成器/在生成器内创建一个数组吗? 如果没有,我可以以某种方式避免/隐藏循环吗?也许通过使用
map
或类似的东西?
提前致谢。
我找到了另一种方法
var arr = Array.from( sequenceGenerator(min, max) );
也有效。
你可以这样做;
function* sequenceGenerator() {
let currVal = this.minVal;
while(currVal <= this.maxVal) yield currVal++;
}
var obj = {minVal: 10, maxVal:20},
arr;
obj[Symbol.iterator] = sequenceGenerator;
arr = [...obj];
console.log(arr);
虽然您问了一个非常具体的问题,但我想知道您是否正在尝试解决一个更普遍的问题,即以方便的方式保留生成器结果。如果去,您可以尝试查看https://github.com/anywhichway/generx。这实际上可以让您像对待数组一样对待生成器,即在运行后使用数组表示法访问它。
{let
isGen = (genProto => (val => genProto.isPrototypeOf(val)))(
Object.getPrototypeOf(function*(){}) ),
iterMthdGen = (() => (function() { return this(); })),
createAddIterMthdFn = (iterMthdFn => ((obj) =>
Object.assign(obj, {[Symbol.iterator]: iterMthdFn(), }) )),
addIterMthdGen = createAddIterMthdFn(iterMthdGen),
wrapGen = (gen => ({[Symbol.iterator]: gen}))
g = function*() { for(i = 0; i < 10; i++) yield i; };
// [0, 1, 2, 3, 4, 5, 6, 7, 8 , 9], [0, 1, 2, 3, 4, 5, 6, 7, 8 , 9]
console.log([...wrapGen(g)], [...addIterMthdGen(g)]); }
使用此配方与发电机一起使用。 wrapGen 是最简单的方法。 addIterMthdGen 使生成器也成为可迭代的。