ES2015의 generator를 이용한 date range
ES2015의 제너레이터를 간략히 문서를 읽어보았다. 지난주에 사용했던 moment-range
모듈에서 내가 필요했던 간단한 기능 정도는 다시 만들 수 있을 것 같았다.
syntax : generator function
function* gen() {
yield 1;
yield 2;
yield 3;
}
function*
문법이 새로 들어왔고, yield
키워드를 통해 generator object를 리턴한다. 그 객체에서 .next()
를 통해 값과 상태를 얻을 수 있는데, iterable protocol을 만족하는 객체여서 for..of
구문으로 순회할 수 있다.
참고
- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Generator
- 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
사용 코드
datetime 조작은 귀찮아서 moment 그대로 씀.
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){
while( !start.isAfter(end) ){
yield start;
start.add(1, 'd');
}
};
const dateIterator = moment_daterange(start, end);
for(let d of dateIterator){
console.log(d.format(moment.HTML5_FMT.DATE));
}
참고로 moment-range
에서 구현한 사항은 다음 링크에서 확인할 수 있는데, generator가 아니라 iterator 로 구현한 것으로 보인다.
https://github.com/rotaready/moment-range/blob/master/lib/moment-range.js