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

时间:2016-05-23 19:08:15

标签: 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”}]

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

tuesday- [{in:“13:00:00”,out:“14:59:59”},{in:“14:00:00”,out:“14:59:59”}]

在第一次迭代中。但我无法弄清楚如何制作超过4或5小时的间隔。我正在使用lodash进行排序和分组以及将小时转换为int的时刻。

如果用户在星期二输入5个间隔,如[{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秒”,指出: “19点59分59秒”}]

我想要将范围合并为;

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

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

2 个答案:

答案 0 :(得分:1)

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



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);
&#13;
&#13;
&#13;

然而,如果具有in和out时间的对象在数组中是任意的,那么一个更概念性的方法,例如首先根据它们的时间排序它们是必不可少的。但这不是一件大事。

答案 1 :(得分:0)

假设范围由Moment实例组成,并且您希望组合任何两个范围,其中一个范围的结尾与另一个范围重叠或者在另一个范围的开始之后小于或等于一秒,此函数应该能够组合范围

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
}