Javascript 结合对象数组范围属性的节点

Javascript 结合对象数组范围属性的节点,javascript,arrays,node.js,object,Javascript,Arrays,Node.js,Object,标题可能有点混乱,但我会详细解释。我在UI中有一个表,用户可以从中选择日期范围,如 星期一-{in:“13:00:00”,out:“13:59:59”} 星期二-[{in:“13:00:00”,out:“13:59:59”},{in:“14:00:00”,out:“14:59:59”}] 用户一天只能选择多小时间隔。我已经根据日期对间隔进行了分组,并将间隔组合为 星期二-[{in:“13:00:00”,out:“14:59:59”},{in:“14:00:00”,out:“14:59:59”}]

标题可能有点混乱,但我会详细解释。我在UI中有一个表,用户可以从中选择日期范围,如

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

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

用户一天只能选择多小时间隔。我已经根据日期对间隔进行了分组,并将间隔组合为

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

在第一次迭代中。但我不知道如何使其间隔超过4或5个小时。仅供参考,我使用lodash进行排序和分组,使用moment将小时转换为整数

如果用户为周二输入5个时间间隔,比如[{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”}]

我想把范围组合成这样

[{in:“13:00:00”,out:“15:59:59”},{in:“18:00:00”,out:“19:59:59”}]


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

假设范围由实例组成,并且您希望组合任意两个范围,其中一个范围的结尾与另一个范围重叠,或者距离另一个范围的开始时间小于或等于1秒,则此函数应能够组合这些范围

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
}
函数组合器(范围){
如果(范围1.1){
组合。推送(下一个)
当前=下一个
}else if(current.out.isBefore(next.out)){
current.out=next.out
}
}
合并收益
}
函数byStart(a,b){
返回a.in-b.in
}

假设您的输入数据是按时间顺序排列的,那么实现缩减时间表的一种方法是:

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=新日期(),
te=新日期(),
reduced=时间片。reduce((p,c)=>{p.length?(ts.setHours(…p[p.length-1])。out.split(“:”),
te.设定小时数(…英寸分割(“:”),

te ts更新了问题:一个范围与另一个范围可以不同的最小时间单位是多少?一秒?一个范围仅仅是一个
Date
实例数组吗?还是字符串/数字/什么?我使用矩.valueOf()将小时转换为整数毫秒,并在以下情况下进行比较((项[I+1]。项[I].out)您试图生成时间片的并集,但是,
[{in:“13:00:00”,out:“14:59:59”},{in:“15:00:00”,out:“15:59:59”}]
有一秒的间隔,所以它们不会相交。那怎么样….?当然可以这样做,但我想
[{in:“13:00:00”,out:“15:00”},{in:“15:00:00”,out:“16:00”}]
可能对编码者和用户都更有意义。我使用的是24小时制,所以您提到的东西在我的用例中会出错。这将把4个连续的范围合并到一个范围中?@fatihaktpe应该这样,假设一个范围看起来有点像:
{in:moment(),out:moment()}
我将实施您的解决方案并相应地更新问题。谢谢。您的解决方案不适用于较远的小时间隔。我按天进行了排序和分组。让我试试您的答案。@Fatih Aktepe:那么我想它无法处理箭头函数,因此ES6代码。那么它大概也会抱怨排列操作符。你有代码背后的逻辑吗?然后你可以在ES5中复制它?或者你也可以复制粘贴左边窗格中的代码,在右边你将得到它的ES5版本。