NodeJS结合了对象数组的范围属性

标题可能有点混乱,但我会详细解释它。 我有一个用户界面表,用户可以从那里selectdate范围,

星期一 – {in:“13:00:00”,out:“13:59:59”}

星期二 – [{in:“13:00:00”,out:“13:59:59”},{in:“14:00:00”,out:“14:59:59”}]

用户每天只能select多个小时的时间间隔。 我已经根据他们的date进行了分组,并结合间隔

星期二 – [{in:“13:00:00”,out:“14:59:59”},{in:“14:00:00”,out:“14:59:59”}]

在第一次迭代。 但我不知道如何使它超过4或5小时的时间间隔.FYI我使用lodash进行sorting和分组,以及将小时转换为int的时刻。

如果用户input5个星期二的时间间隔,例如[{in:“13:00:00”,out:“13:59:59”},{in:“14:00:00”,out:“14:59:59 “},{在:” 15:00:00" ,指出: “15点59分59秒”},{在: “18:00:00”,指出: “18时59分59秒”},{在: “19:00:00”,指出: “十九时59分59秒”}]

我想要范围结合像;

[{在: “13:00:00”,指出: “15点59分59秒”},{在: “18:00:00”,指出: “19点59分59秒”}]

任何帮助或build议将不胜感激。

假设你的input数据是按时间顺序排列的,那么实现你缩短时间表的一种方法是这样的;

 var timeSlices = [{in:"13:00:00",out:"13:59:59"},{in:"14:00:00",out:"14:59:59"},{in:"15:00:00",out:"15:59:59"},{in:"18:00:00",out:"18:59:59"},{in:"19:00:00",out:"19:59:59"}], ts = new Date(), te = new Date(), reduced = timeSlices.reduce((p,c) => {p.length ? (ts.setHours(...p[p.length-1].out.split(":")), te.setHours(...c.in.split(":")), te-ts <= 1000 ? p[p.length-1].out = c.out : p.push(c)) : p.push(c); return p;},[]); console.log(reduced); 

假设范围由矩实例组成,并且您想要合并任意两个范围,其中一个范围的末尾要么与另一个范围重叠,要么小于或等于另一个范围的起始一秒钟,则此函数应该能够合并范围

 function combineRanges (ranges) { if (ranges.length <= 1) { return ranges } ranges = ranges.sort(byStart) var current = ranges[0] var combined = [current] for (var i = 1; i < ranges.length; i++) { var next = ranges[i] if (current.out.diff(next.in, 'seconds') > 1) { combined.push(next) current = next } else if (current.out.isBefore(next.out)) { current.out = next.out } } return combined } function byStart (a, b) { return a.in - b.in }