ES2015 iterator 로 date range 만들어보기

generator 로 date range를 만들어봤는데, 그렇다면 iterator 랑은 무슨 차이인가 싶어서 만들어봄.

iterator는 어떤 시퀀스를 정의하여 값을 돌려주는, iterator 프로토콜을 만족하는 객체를 말한다.

iterator 프로토콜은 .next() 메소드를 구현하면 되고, .next() 메소드는 donevalue로 시퀀스의 완료여부와 값을 담은 객체를 리턴하면 된다.

iterator 객체는 명시적으로 .next() 를 호출하며 순회해야 한다. for of 같은데서 쓰려면 Iterable protocol을 구현해야 한다.

간단히는 이렇게 볼 수 있고, iterable과 Symbol.iterator 에 대해서는 내일 알아보자.

참고

  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Iterators_and_Generators
  • https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Iteration_protocols

사용 코드


const moment = require('moment');

const start = moment('2018-10-15', 'YYYY-MM-DD');
const end = moment('2018-11-22', 'YYYY-MM-DD');

const moment_daterange = function (start, end) {
    let next = start;

    return {
        next: () => {
            if (!next.isAfter(end)) {
                const ret = next.clone();
                next.add(1, 'd');
                return {value: ret, done: false}
            } else {
                return {value: undefined, done: true};
            }
        }
    };
};


const dateIterator = moment_daterange(start, end);

let result = dateIterator.next();
while (!result.done) {
    console.log(result.value.format(moment.HTML5_FMT.DATE));
    result = dateIterator.next();
}