【问题标题】:NodeJS combining object array range propertiesNodeJS结合对象数组范围属性
【发布时间】:2016-09-20 18:54:41
【问题描述】:

标题可能有点混乱,但我会详细解释。我在 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 进行排序和分组,以及将时间转换为 int 的时刻。

如果用户在星期二输入 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:59"}]

我希望将范围组合为 ;

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

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

【问题讨论】:

  • 更新了问题
  • 一个范围与另一个范围不同的最小时间单位是多少?一秒?范围只是Date 实例的数组吗?还是它们是字符串/数字/其他?
  • 我使用 moment.valueOf() 将小时转换为 int 毫秒并进行比较 if ((item[i+1].in-item[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:00"},{in:"15:00:00",out:"16:00:00"}] 对于编码器和用户来说可能更有意义。
  • 我使用的是 24 小时制,所以你提到的事情会在我的用例中引发错误。

标签: javascript arrays node.js object


【解决方案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);

但是,如果具有进出时间的对象位于数组中的任意位置,那么一种更具概念性的方法(例如首先根据它们的进出时间对它们进行排序)将是必不可少的。不过这没什么大不了的。

【讨论】:

  • 我按照天进行了排序和分组。让我试试你的答案。
  • @Fatih Aktepe:那么我想它不能处理箭头函数,因此是 ES6 代码。然后它可能也会抱怨传播运算符。你知道代码背后的逻辑吗?那么你可以在 ES5 中复制它吗?或者作为另一个想法,您也可以将代码复制粘贴到左侧窗格的babeljs.io/repl,在右侧您将获得它的 ES5 版本。
【解决方案2】:

假设范围由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
}

【讨论】:

  • 这会将 4 个连续的范围合并为一个范围?
  • @FatihAktepe 它应该,假设一个范围看起来有点像:{ in: moment(), out: moment() }
  • 我将实施您的解决方案并相应地更新问题。谢谢。
  • 您的解决方案不适用于长时间间隔。
猜你喜欢
  • 2020-12-05
  • 1970-01-01
  • 2015-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-06-09
  • 1970-01-01
  • 2016-04-07
  • 2012-02-22
相关资源
最近更新 更多