将iterable中的第一个N项转换为Array

时间:2017-11-29 01:54:46

标签: javascript arrays slice infinite iterable

与问题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);

2 个答案:

答案 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

如果您更频繁地需要此功能,则可以创建生成器功能:

&#13;
&#13;
Array.from({length: 3}, function(){ return this.next().value; }, Z());
&#13;
&#13;
&#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) )