【发布时间】:2019-05-27 16:51:00
【问题描述】:
假设我有一台发电机,它最终会停止
function* letters () {
let offset = 0
while (offset < 26)
yield String.fromCharCode(65 + offset++)
}
console.log(Array.from(letters()))
// => [ "A", "B", "C", ..., "X", "Y", "Z" ]
使用该生成器作为输入,我想创建另一个生成器,但对于这个,我希望值以随机顺序出现
function* randomizeGen (gen) {
// ...
}
Array.from(randomizeGen(letters()))
// => [ "X", "T", "L", "P", "A", ..., "G", "S", "B" ] (all 26 letters)
新的生成器应该是懒惰的,就像第一个一样,但我不知道如何以聪明的方式编写它
function shuffleArray (arr) {
// return shuffled array
}
function* randomizeGen (gen) {
const all = Array.from(gen) // help!
for (const one of shuffleArray(all))
yield one
}
这会起作用,但它是通过首先完全耗尽gen 来实现的。实际上,我的初始生成器输出 数百万个值,所以我认为首先将它们全部收集到一个数组中并不是一个好主意。使用生成器的全部意义在于我可以一次处理一个值
老实说,我不知道如何随机化生成器的输出,但同时保持它的惰性。有人可以帮忙吗?
【问题讨论】:
-
你可以在将数组传递给第二个生成器之前对其进行洗牌吗?
shuffle(Array.from(letters())); -
似乎你最好在这里使用一个新的生成器,而不是试图从另一个输出中导出它。如果不先汇集一堆值,就没有办法做到这一点。
标签: javascript generator