在JavaScript中从Generator创建数组

gblwokeq  于 12个月前  发布在  Java
关注(0)|答案(5)|浏览(107)

我想从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或类似的东西?
先谢了。

nkcskrwz

nkcskrwz1#

一个简短的解决方案可能是:

let list = [...sequenceGenerator(min, max)]

字符串
关于MDN的文档

xvw2m8pv

xvw2m8pv2#

我找到了另一种方法

var arr = Array.from( sequenceGenerator(min, max) );

字符串
也是有效的。

pftdvrlh

pftdvrlh3#

你可以这样做

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);

字符串

xkrw2x1b

xkrw2x1b4#

虽然你问了一个非常具体的问题,但我想知道你是否试图解决一个更普遍的问题,即以方便的方式保存生成器的结果。如果去,你可以尝试查看https://github.com/anywhichway/generx。这实际上会让你把生成器当作一个数组,即在它运行后使用数组表示法访问它。

iqjalb3h

iqjalb3h5#

{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使生成器也是一个可迭代的。

相关问题