Iterators e generators são uma forma poderosa de trabalhar com sequências de dados sob demanda, sem carregar tudo em memória de uma vez. O problema é que, até pouco tempo atrás, eles não tinham métodos como map() ou filter() — era preciso converter tudo para array primeiro. Os Iterator Helpers resolvem exatamente isso.
O problema antes dos Iterator Helpers
function* numeros() {
let n = 1;
while (true) yield n++;
}
// Precisava converter para array (e cortar antes, ou nunca terminava)
const primeiros5 = [...numeros()].slice(0, 5); // trava, sequência infinita!
Como numeros() gera uma sequência infinita, transformar tudo em array antes de filtrar simplesmente nunca termina.
Como funcionam os Iterator Helpers
Agora, iterators (incluindo generators) têm métodos nativos que operam item a item, sob demanda, sem precisar materializar a sequência inteira:
function* numeros() {
let n = 1;
while (true) yield n++;
}
const primeiros5 = numeros().take(5);
console.log([...primeiros5]); // [1, 2, 3, 4, 5]
take(5) consome apenas os 5 primeiros valores do generator infinito, sem travar.
Encadeando operações
Assim como em arrays, é possível encadear map(), filter(), take() e outros métodos:
function* numeros() {
let n = 1;
while (true) yield n++;
}
const resultado = numeros()
.filter(n => n % 2 === 0)
.map(n => n * 10)
.take(3);
console.log([...resultado]); // [20, 40, 60]
Cada valor passa pela cadeia inteira antes do próximo ser gerado — nada é processado além do necessário.
drop() para pular itens
const numeros = [1, 2, 3, 4, 5, 6].values(); // iterator de um array
const semOsTres = numeros.drop(3);
console.log([...semOsTres]); // [4, 5, 6]
Convertendo para array só quando necessário
function* linhas(texto) {
for (const linha of texto.split('\n')) yield linha;
}
const primeirasTresLinhas = linhas(arquivoGrande).take(3).toArray();
toArray() materializa o resultado final em um array comum, só depois de todas as transformações "preguiçosas" terem sido aplicadas.
Quando usar
- Processar sequências grandes ou infinitas sem carregar tudo em memória.
- Ler arquivos, streams ou respostas paginadas de uma API item a item.
- Compor transformações (
filter,map,take) de forma preguiçosa, processando só o necessário.
Compatibilidade
Essa é uma funcionalidade mais recente e ainda em expansão entre navegadores. Vale sempre checar o suporte antes de usar em produção, principalmente se o projeto precisar suportar navegadores mais antigos.
Conclusão
Os Iterator Helpers trazem a mesma expressividade dos métodos de array para iterators e generators, permitindo trabalhar com sequências grandes ou infinitas de forma preguiçosa e eficiente, sem abrir mão de um código legível.
0 Comentário
Deixe seu Comentário!