Iterators ES6

Uma nova forma de interagir com collections no Javascript

por Bruno Belarmino 20/03/2015

A partir de hoje iniciaremos uma série de posts falando sobre as novidades da nova versão do Javascript, conhecida como ES6 (EcmaScript 6). Que esta recheada de novidades e contemplando features muito legais como você verá na série.

Como post de abertura vou falar hoje sobre iterators.

O que são?

Iterator é um objeto com uma determinada interface. E essa interface consiste de um método chamado next() que retorna um objeto como resultado.

Esse objeto de resultado, tem duas propriedades value referente ao valor corrente e done que é um valor booleano qual é setado para true quando não existem mais valores para serem retornados.

O iterator mantém uma referência à posição correta do próximo valor dentro da coleção de valores. Deste modo, toda vez que o método next() é chamado ele retorna o valor correto. Caso o método next() for chamado após o último valor ser retornado o iterator irá retornar o objeto de resultado com os seguintes valores: done = true e value = undefined.

Show me the code!

Com esse entendimento vamos ver na prática a implementação de um iterator:

    var criarIterator = function(items){
        var i = 0;

        return {
            next: function(){

                var done = (i>= items.length);
                var value = !done ? items[i++] : undefined;

                return {
                    done: done,
                    value: value
                };
            }
        }
    };

    var iterator = criarIterator([1, 2, 3]);

    console.log(iterator.next());  // "{ value: 1, done: false}"
    console.log(iterator.next());  // "{ value: 2, done: false}"
    console.log(iterator.next());  // "{ value: 3, done: false}"
    console.log(iterator.next());  // "{ value: undefined, done: true}"

Simples, neh!?

Imagino que se você tenha conhecimentos em Java ou C# já tenha se perguntado, será? E a resposta é sim! Iterator em Javascript funciona de uma maneira bem semelhante ao iterator dessas linguagens.

Iterator é uma peça fundamental na nova forma de manipular coleções de dados no ES6. Sendo assim, todos os tipos de coleções (Arrays, Sets, Maps e até mesmo Strings) já vem com essa interface implementada. Liberando novas formas de interação com esses objetos.

Além disso um bom entendimento sobre iterators irá te dar uma base sólida e te ajudar muito no entendimento de outras features do ES6. Assim como collections, for of e generators que serão assuntos dos próximos posts da série.

Até a próxima!