我需要过滤出以下例如对象数组的开始和结束(moment.js)时间的任何重叠
[{ start: moment("2019-03-23T15:55:00.000"), end: moment("2019-03-23T16:55:00.000")},
{ start: moment("2019-03-23T14:40:00.000"), end: moment("2019-03-23T17:30:00.000")},
{ start: moment("2019-03-23T18:45:00.000"), end: moment("2019-03-23T19:45:00.000")},
{ start: moment("2019-03-23T17:10:00.000"), end: moment("2019-03-23T20:00:00.000")},
{ start: moment("2019-03-23T21:35:00.000"), end: moment("2019-03-23T22:35:00.000")},
{ start: moment("2019-03-23T19:15:00.000"), end: moment("2019-03-23T22:05:00.000")},
{ start: moment("2019-03-23T22:30:00.000"), end: moment("2019-03-23T23:30:00.000"),
}]
在上面的示例中,日期都在同一天(03/23),因此在查看时间时,我需要遍历每个对象,并采用最早的开始时间和最新的结束时间,而没有交叠。我需要交替start, end, start, end ...
次的最终数组。
因此,对于上面的示例,我需要直接过滤为以下内容:
start: 14:40:00
end: 17:30:00
start: 18:45:00
end: 20:00:00
start: 21:35:00
end: 23:30:00
如您所见,第二个开始时间仅发生在第一个结束时间之后,而最终的结束时间基本上是最后一个可用的结束时间。整个组中最早可用的开始是14:40:00,因此它获得了第一个空位。
另外一个例子是开始时间17:10:00;该开始时间已在第一个开始/结束时间中被覆盖,因此将被忽略,但是它的成对结束时间20:00:00在19:45:00之后,因此它将替换循环中的该结束时间。>
我希望这是有道理的,如果没有,请告诉我。
我提出的内容仍然包含重叠部分,即使可以使用,我也不满意。
times.forEach(time => {
// start with the first object
if (filtered.length === 0) {
filtered.push({'start': time.start, 'end': time.end});
}
// if this start time is AFTER the prior end time, add it
if (time.start.isAfter(filtered[filtered.length-1]['end'])) {
filtered.push({'start': time.start, 'end': time.end});
}
if (time.start.isBefore(filtered[filtered.length-1]['end'])) {
// replace the prior end time
filtered[filtered.length-1]['end'] = time.end;
}
});
正如我所说,这显然不是很好,但不确定如何做到最好。
答案 0 :(得分:1)
boundaries = [];
times.forEach (time => {
boundaries.push ({type: "start", value: time.start});
boundaries.push ({type: "end", value: time.end})
});
这将为您提供一系列边界,如下所示:
[
{type: "start", value: moment("2019-03-23T15:55:00.000")},
{type: "end", value: moment("2019-03-23T16:55:00.000")},
{type: "start", value: moment("2019-03-23T14:40:00.000")},
{type: "end", value: moment("2019-03-23T17:30:00.000")},
{type: "start", value: moment("2019-03-23T18:45:00.000")},
{type: "end", value: moment("2019-03-23T19:45:00.000")},
{type: "start", value: moment("2019-03-23T17:10:00.000")},
{type: "end", value: moment("2019-03-23T20:00:00.000")},
{type: "start", value: moment("2019-03-23T21:35:00.000")},
{type: "end", value: moment("2019-03-23T22:35:00.000")},
{type: "start", value: moment("2019-03-23T19:15:00.000")},
{type: "end", value: moment("2019-03-23T22:05:00.000")},
{type: "start", value: moment("2019-03-23T22:30:00.000")},
{type: "end", value: moment("2019-03-23T23:30:00.000")}
]
现在通过value
对该数组进行排序,并遍历已排序的数组,计算通过的“开始”边界的数量减去通过的“结束”边界的数量。即在每个“开始”边界上递增计数器,并在每个“结束”边界上递减计数器。
每个时间计数器从零变为非零,输出经过过滤的“开始”边界。每当计数器从非零下降到零时,输出过滤的“结束”边界。