在 JavaScript 中从生成器创建数组

问题描述 投票:0回答:5

我想根据 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
或类似的东西?

提前致谢。

javascript arrays generator
5个回答
57
投票

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

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

MDN

上的文档

36
投票

我找到了另一种方法

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

也有效。


4
投票

你可以这样做;

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


0
投票

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


0
投票
{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 使生成器也成为可迭代的。

© www.soinside.com 2019 - 2024. All rights reserved.