javascript - 拆分日期范围重叠成块(javascript)
问题描述
我想出了一个概念,但在将其转换为代码时遇到了麻烦。
这是一张更好地帮助解释我的想法的图片:
无法通过图片判断,但日期之间也可能存在差距。
不要让它成为一个 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 min = Infinity;
var max = 0;
var 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, intersects: false },
{ start: new Date('Jan 16, 2018 00:00:00 GMT+0200'), end: new Date('Jan 29, 2018 13:00:00 GMT+0200'), bonus: 25, intersects: false },
{ start: new Date('Feb 12, 2018 00:00:00 GMT+0200'), end: new Date('Feb 18, 2018 23:59:59 GMT+0200'), bonus: 20, intersects: false },
{ start: new Date('Feb 19, 2018 00:00:00 GMT+0200'), end: new Date('Feb 29, 2018 23:59:59 GMT+0200'), bonus: 15, intersects: 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, intersects: 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, intersects: false }
];
bonuses
.map(function (a, index) {
if (a.start.getTime() < min) {
min = a.start.getTime();
}
if (a.end.getTime() < min) {
min = a.end.getTime();
}
if (a.start.getTime() > max) {
max = a.start.getTime();
}
if (a.end.getTime() > max) {
max = a.end.getTime();
}
for (var i = index + 1; i < bonuses.length; i++) {
var b = bonuses[i];
if (b.start.getTime() < a.start.getTime() && b.end.getTime() > a.start.getTime() ||
a.start.getTime() < b.start.getTime() && a.end.getTime() > b.start.getTime()) {
bonuses[i].intersects = true;
a.intersects = true;
}
}
return a;
});
var tileSize = 20;
var canvas = document.body.appendChild(document.createElement("canvas"));
canvas.width = 800;
canvas.height = bonuses.length * tileSize;
var ctx = canvas.getContext("2d");
bonuses.forEach(function (bonus, index) {
var start = (bonus.start.getTime() - min) / (max - min);
var end = (bonus.end.getTime() - min) / (max - min);
ctx.fillStyle = bonus.intersects ? "red" : "green";
ctx.fillRect(canvas.width * start, tileSize * index, canvas.width * (end - start), tileSize);
ctx.strokeRect(canvas.width * start, tileSize * index, canvas.width * (end - start), tileSize);
});
推荐阅读
- hyperledger-fabric - 在超级账本结构中升级链码没有错误,但不反映更改
- redis - 使用 MIGRATE 和 COPY 将 Redis 数据库(所有键)从旧 Redis 服务器复制到新 Redis 服务器...
- python - XGBoostError: Unknown gbm type g - 在 XGBoostClassifier 模型上运行 RandomGridSearchCV
- python - python win32com 在 Powerpoint 中运行宏
- r - 如何在r中使用给定参数创建泊松回归
- pytorch - Data_loader 导致“set”调用错误
- javascript - 引导模态堆叠数据?
- python-3.x - Solarwinds API SSL 证书无法验证
- node.js - NodeJs get-Pixels 隔离红色通道
- terraform - 如何在 tfsec 中创建自定义检查