将可迭代的前N个项目转换为数组

tsh*_*tsh 5 javascript arrays iterable infinite slice

类似于问题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);
Run Code Online (Sandbox Code Playgroud)

le_*_*e_m 8

要获取 a 的第一个niterator,您可以使用以下之一:

Array.from({length: n}, function(){ return this.next().value; }, iterator);
Array.from({length: n}, (i => () => i.next().value)(iterator));
Run Code Online (Sandbox Code Playgroud)

要获得iterator任意的iterable,请使用:

const iterator = iterable[Symbol.iterator]();
Run Code Online (Sandbox Code Playgroud)

在你的情况下,给定一个生成器函数Z

Array.from({length: 3}, function(){ return this.next().value; }, Z());
Run Code Online (Sandbox Code Playgroud)

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

Array.from({length: n}, function(){ return this.next().value; }, iterator);
Array.from({length: n}, (i => () => i.next().value)(iterator));
Run Code Online (Sandbox Code Playgroud)

  • @AluanHaddad 添加了一些甜味剂 (2认同)

CRi*_*ice 3

没有内置方法可以从可迭代对象中仅获取一定数量的项目(例如take())。尽管您的代码片段可以通过for of循环进行一些改进,但它专门用于使用可迭代对象,例如:

let a = []; let i = 0; for (let x of Z()) { a.push(x); if (++i === N) break; }
Run Code Online (Sandbox Code Playgroud)

这可能会更好,因为即使可迭代中没有 N 个项目,原始代码片段也会继续循环。