Patrón de comportamiento Iterador (JavaScript) - fapaccha/Dise-o-dirigido-por-el-modelo GitHub Wiki

Iterador(JavaScript)

a

El patrón de diseño iterador o iterator proporciona una manera de acceder a elementos de un objeto (que contiene algún tipo de datos agregados como un arreglo o una lista) secuencialmente sin exponer su estructura interna. Este patrón de diseño también es conocido como cursor, si has usado cursores para recorrer los elementos obtenidos de una base de datos, ¿Que crees?, ahí estas utilizando el patrón de diseño iterador.

El objetivo de este patrón es poder recorrer y obtener elementos de un objeto sin necesidad de saber como estos datos están estructurados. Además de que la responsabilidad de recorrer los elementos no está en el objeto sino en el iterador.

Un iterador se compone normalmente de los siguientes métodos:

  • iterador.hasNext()
  • iterador.next()
  • iterador.current()
  • iterador.rewind()
const iterador =  (function () {
  let data = [1,2,3,4,5,6,7,8,9,10];
  let index = 0;
  let length = data.length;

  return {
    /**
     * ¿Aún me faltan elementos por recoorer?
     * @return Boolean
     */
    hasNext () {
      return index < length;
    },
    /**
     * Quiero el "siguiente" elemento. "siguiente" elemento es lo que esta función regrese,
     * puede ser cualquier elemento dentro del arreglo "data"
     * @return Number   The next element
     */
    next () {
      let element;
      if (!this.hasNext()) {
        return null;
      }
      element = data[index];
      index += 2;
      return element;
    },
    /**
     * Quiero el elemento actual, no uso next porque provocaria un incremento en el index
     * @return {[type]} [description]
     */
    current () {
      return data[index];
    },
    /**
     * Regresar el cursor al primer elemento, asi puede recorrer los elementos nuevamente
     * @return undefined
     */
    rewind () {
      index = 0;
    }
  };
}());

const body = document.body;
// Aquí usamos el método hasNext() y el ciclo while para recorrer los elementos
while (iterador.hasNext()) {
  body.append('siguiente: ' + iterador.next() + '\n');
}

// rebobinamos al inicio de los datos
iterador.rewind();
// Ahora el elemento actual debe ser "1"
body.append('Elemento actual: ' + iterador.current());