过滤对象日期时间的javascript数组,因此没有重叠

时间:2019-03-22 13:13:05

标签: javascript arrays momentjs

我需要过滤出以下例如对象数组的开始和结束(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;
    }
});

正如我所说,这显然不是很好,但不确定如何做到最好。

1 个答案:

答案 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对该数组进行排序,并遍历已排序的数组,计算通过的“开始”边界的数量减去通过的“结束”边界的数量。即在每个“开始”边界上递增计数器,并在每个“结束”边界上递减计数器。

每个时间计数器从零变为非零,输出经过过滤的“开始”边界。每当计数器从非零下降到零时,输出过滤的“结束”边界。