先给一个看起来好看一点的const getMonthes = (() => {
function toInteger(date) {
const [y, m] = date.split("-").map(s => parseInt(s));
return y * 12 + m;
}
return function (start, end) {
const iStart = toInteger(start);
const iEnd = toInteger(end);
return Array
.from(Array(iEnd - iStart + 1), (_, i) => i + iStart)
.map(n => `${Math.floor(n / 12)}-${((n - 1) % 12 + 1).toString().padStart(2, "0")}`);
};
})();
再给一个通俗一点的(算法都一样):function getMonthes2(start, end) {
const sa = start.split("-").map(s => parseInt(s));
const iStart = sa[0] * 12 + sa[1];
const ea = end.split("-").map(s => parseInt(s));
const iEnd = ea[0] * 12 + ea[1];
const result = Array(iEnd - iStart + 1);
for (let i = iStart; i <= iEnd; i++) {
const year = Math.floor(i / 12);
const month = (i - 1) % 12 + 1;
result[i - iStart] = `${year}-${month.toString().padStart(2, "0")}`;
}
return result;
}
而且下面这个的效率,大概是上面那个的 2 倍。
测试:[getMonthes, getMonthes2]
.forEach((fn, i) => console.log(i, fn("2020-11", "2021-02")));
输出0 [ '2020-11', '2021-12', '2021-01', '2021-02' ]
1 [ '2020-11', '2021-12', '2021-01', '2021-02' ]