javascript - 拆分日期范围重叠成 block (javascript)

标签 javascript datetime momentjs projection date-range

我提出了一个概念,但无法将其转化为代码。

这里有一张图片可以更好地帮助解释我的想法: da picture

无法通过图片判断,但日期之间也可能存在差距。

不是为了让它成为 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))

最佳答案

var dates = [];
bonuses.forEach(item => {
    dates.push(item.start);
    dates.push(item.end);
});
dates.sort();
var ranges = [];
for(var i=1;i<dates.length;i++){
    ranges.push({
        start: dates[i-1], 
        end: dates[i]
    });
}
console.log(ranges);

关于javascript - 拆分日期范围重叠成 block (javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50603232/

相关文章:

javascript - 如何使用 Promise 等待函数内的事件完成然后再次调用该函数?

javascript - 为什么 "[[1, 2], [3, 4]].indexOf([1, 2])"返回-1?

javascript - 第一次尝试firebase云功能

datetime - 在Ecto.DateTime和DateTime之间转换

javascript - MomentJS 有时会添加错误的小时数

javascript - 带有状态的 React HOC 错误

python - Pandas:如何将日期格式 %Y-%M-%D 转换为 %Y%M%D?

javascript - 使用 Moment 为 HighCharts 输出 Date.UTC() 对象?

javascript - 准备一个具有相应值的日期数组

javascript - 将时间格式转换为iso格式