【问题标题】:How to find common intervals between hours?如何找到小时之间的共同间隔?
【发布时间】:2019-02-01 20:52:31
【问题描述】:

我有两个有间隔的数组:

[
  [
    [8:00,  11:30], // [begin,end]
    [12:00, 16:00], // [begin,end]
    [18:00, 21:00]  // [begin,end]
  ],
  [
    [8:00,  15:30], // [begin,end]
    [16:00, 17:45], // [begin,end]
    [19:00, 21:30]  // [begin,end]
  ]
]

我需要找到这些时间的共同间隔,所以应该是:

[
  [8:00,  11:30],
  [12:00, 15:30],
  [19:00, 21:00]
]

我将小时更改为分钟,然后将第一个数组的间隔与第二个数组的间隔进行比较,但输出不像上面显示的那样。

有人知道怎么解决吗?

 let hours = [[[8:00,11:30],[12:00,16:00],[18:00,21:00]]
    [[8:00,15:30],[16:00,17:45],[19:00,21:30]]]  

    let commonHors=[];
    for (let i=0; i<(hours||[]).length; i++){
      for(let j=0; j<(hours||[])[i].length; j++){

        let fromFirst = moment.duration(hours[0][j][0]).minutes() + 
        moment.duration(hours[0][j][0]).hours()*60;

        let fromSec = moment.duration(hours[1][j][0]).minutes() + 
        moment.duration(hours[1][j][0]).hours()*60;

        let toFirst = moment.duration(hours[0][j][1]).minutes() + 
        moment.duration(hours[0][j][1]).hours()*60;

        let toSec = moment.duration(hours[1][j][1]).minutes() + 
        moment.duration(hours[0][j][1]).hours()*60;

        if(fromFirst >=  fromSec && toFirst <= toSec){
          commonHors.push(hours[0][j][0],hours[0][j][1]);
        }
        else if(fromFirst <=  fromSec && toFirst <= toSec){
          commonHors.push(hours[1][j][0],hours[0][j][1]);
        }
        else if(fromFirst >=  fromSec && toFirst >= toSec){
          commonHors.push(hours[0][j][0],hours[1][j][1]);
        }        
        else if(fromFirst <=  fromSec && toFirst >= toSec){
          commonHors.push(hours[1][j][0],hours[1][j][1]);
        }     
      }
    }

【问题讨论】:

  • 您必须更清楚地定义“公共间隔”的含义。目前尚不清楚(无论如何对我来说)为什么您显示的预期结果是正确的。你用来推导它们的规则是什么?而且,目前的代码出了什么问题?您是否收到错误或不正确的输出?请说明清楚,这样我们就不必重新开始并重新执行您在卡住之前(希望)已经执行的所有相同调试。
  • 根据前两个内部数组[8:00, 11:30],[12:00, 15:30],您的常见间隔是三个半小时,但最后一个是两个小时间隔[19:00, 21:00]?如果找到等于相同的间隔是目标,那么最后一个时间间隔让我感到困惑,如果这确实是你所说的解决方案。
  • 我编辑了一点我的答案。数组中的这些时间是开始时间和结束时间。我需要在第一个数组和第二个数组中找到几个小时同时属于小时的新间隔。这个区间:[19:00, 21:00] 可以,因为 19:00 在 [18:00, 21:00] 之间,但是 21:30 不是,所以 21:00 是最后一小时(21:00 是在 [18:00, 21:00])

标签: javascript arrays reactjs


【解决方案1】:

这不是迄今为止最漂亮的解决方案,但它在输入数据有效且已经排序的条件下工作。我希望我理解你的问题,我的解决方案是有帮助的。编辑:我使用字符串而不是其他时间格式 - 刚刚意识到,但改变它应该不难,因为我按数值排序;

let intervals = [
    [
        ['8:00',  '11:30'],
        ['12:00',  '16:00'],
        ['18:00',  '21:00']
    ],
    [
        ['8:00',  '15:30'],
        ['16:00', '17:45'],
        ['19:00', '21:30']
    ]
];

let out = [];


while(intervals[0].length > 0) {

    let laterNum = later(0, 0);
    let startTime = intervals[laterNum][0][0];
    let earlyNum = earlier(0, 1);
    let endTime = intervals[earlyNum][0][1];

    if (Number(endTime.replace(':', '')) > Number(startTime.replace(':', '')))
        out.push([startTime, endTime]);

    intervals[earlyNum].splice(0, 1);

}

function earlier(line, time) {
    let a = intervals[0][line][time];
    let b = intervals[1][line][time];

    return Number(a.replace(':', '')) < Number(b.replace(':', '')) ? 0 : 1;
}

function later(line, time) {
    return earlier(line, time) === 1 ? 0 : 1;
}


console.log(out);

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-19
    • 2015-03-22
    • 2020-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多