与问题Convert ES6 Iterable to Array类似的内容。但我只想要前N个项目。我有没有内置这样做?或者我怎样才能更优雅地实现这一目标?
let N = 100;
function *Z() { for (let i = 0; ; i++) yield i; }
// This wont work
// Array.from(Z()).slice(0, N);
// [...Z()].slice(0, N)
// This works, but a built-in may be preferred
let a = [], t = Z(); for (let i = 0; i < N; i++) a.push(t.next().value);
答案 0 :(得分:3)
要获得n
的第一个iterator
值,您可以使用以下其中一个:
Array.from({length: n}, function(){ return this.next().value; }, iterator);
Array.from({length: n}, (i => () => i.next().value)(iterator));
要获取任意iterator
的{{1}},请使用:
iterable
在您的情况下,给定生成器函数const iterator = iterable[Symbol.iterator]();
:
Z
如果您更频繁地需要此功能,则可以创建生成器功能:
Array.from({length: 3}, function(){ return this.next().value; }, Z());
&#13;
答案 1 :(得分:0)
使用.map
会更短,效率更低,使用自定义功能会更安全一些:
function *Z() { for (let i = 0; i < 5; ) yield i++; }
function buffer(t, n = -1, a = [], c) {
while (n-- && (c = t.next(), !c.done)) a.push(c.value); return a; }
const l = console.log, t = Z()
l( [...Array(3)].map(v => t.next().value) )
l( buffer(t) )