【发布时间】:2018-11-09 05:21:31
【问题描述】:
我想出了一个概念,但无法将其转换为代码。
这里有一张图片可以更好地帮助解释我的想法:
无法通过图片判断,但日期之间也可能存在间隔。
不要让它成为一个 XY 问题,这就是我需要这样做的原因。我有一系列日期范围和奖金,我想创建一个包含奖金总和的非重叠日期数组。
我正在尝试将重叠部分拆分为不再重叠的卡盘。遇到一个名为moment-range 的包。我想要成功的东西可能有一个名字吗? “将日期范围投影到线性...某物上”
下面的最终代码
const _ = require('lodash')
const Moment = require('moment')
const MomentRange = require('moment-range')
const moment = MomentRange.extendMoment(Moment);
let bonuses = [
{start: new Date('Jan 15, 2018 23:00:00 GMT+0200'), end: new Date('Jan 18, 2018 23:59:59 GMT+0200'), bonus: 30, preSale: true},
{start: new Date('Jan 17, 2018 00:00:00 GMT+0200'), end: new Date('Jan 29, 2018 13:00:00 GMT+0200'), bonus: 25, preSale: true},
{start: new Date('Feb 12, 2018 00:00:00 GMT+0200'), end: new Date('Feb 18, 2018 23:59:59 GMT+0200'), bonus: 20, preSale: false},
{start: new Date('Feb 19, 2018 00:00:00 GMT+0200'), end: new Date('Feb 27, 2018 23:59:59 GMT+0200'), bonus: 15, preSale: false},
{start: new Date('Feb 26, 2018 00:00:00 GMT+0200'), end: new Date('Mar 4, 2018 23:59:59 GMT+0200'), bonus: 10, preSale: false},
{start: new Date('Mar 5, 2018 00:00:00 GMT+0200'), end: new Date('Mar 11, 2018 23:59:59 GMT+0200'), bonus: 5, preSale: false},
]
_.map(bonuses, o => o.range = moment.range(o.start, o.end))
let dates = []
_.each(bonuses, o => {
dates.push(o.start)
dates.push(o.end)
})
dates.sort(function(a, b) {
return a-b
})
let ranges = []
for(let i=1; i<dates.length; i++) {
ranges.push({
start: dates[i-1],
end: dates[i],
range: moment.range(dates[i-1], dates[i])
})
}
for (let range of ranges) {
range.bonus = 0
for (let bonus of bonuses) {
if (range.range.intersect(bonus.range)) {
range.bonus += bonus.bonus
}
}
}
_.each(ranges, r => console.log(r.start, ' - ', r.end, ' => ', r.bonus))
【问题讨论】:
-
从图片上看,我想说你简单地将所有开始时间和结束时间放入一个数组中,对它们进行排序......然后你就有了所有目标间隔的“边界”...... ?
-
@CBroe 我更新了问题,你建议我现在做什么?
标签: javascript datetime momentjs projection date-range