2016-04-26 127 views
1

我有以下的Javascript成为对象:的Javascript检查是否范围重叠

function checkTimeOverlapping() { 

     var scheduleIntervalContainerWrappers = []; 

     var scheduleIntervalContainerWrapper1 = {}; 
     scheduleIntervalContainerWrapper1.start = '08:00'; 
     scheduleIntervalContainerWrapper1.end = '10:00'; 
     scheduleIntervalContainerWrappers.push(scheduleIntervalContainerWrapper1); 

     var scheduleIntervalContainerWrapper2 = {}; 
     scheduleIntervalContainerWrapper2.start = '09:00'; 
     scheduleIntervalContainerWrapper2.end = '14:00'; 
     scheduleIntervalContainerWrappers.push(scheduleIntervalContainerWrapper2); 

     ... 

     alert(scheduleIntervalContainerWrappers); 
    } 

,我会检查scheduleIntervalContainerWrapper重叠开始和结束时间。 有没有可能在纯js中做到这一点?

+0

'scheduleIntervalContainerWrapper1.end'丢失... – Rayon

+2

由于JavaScript是一种图灵完备的语言,我想是的。 – 2016-04-26 08:03:42

+0

http://nedbatchelder.com/blog/201310/range_overlap_in_two_compares.html – georg

回答

0

含有一些测试用例的提案。转换为分钟。

function overlapping(a, b) { 
 
    function getMinutes(s) { 
 
     var p = s.split(':').map(Number); 
 
     return p[0] * 60 + p[1]; 
 
    } 
 
    return getMinutes(a.end) > getMinutes(b.start) && getMinutes(b.end) > getMinutes(a.start); 
 
} 
 

 
document.write(overlapping({ start: '00:00', end: '00:00' }, { start: '00:00', end: '00:00' }) + '<br>'); 
 
document.write(overlapping({ start: '00:00', end: '02:00' }, { start: '00:00', end: '02:00' }) + '<br>'); 
 
document.write(overlapping({ start: '00:00', end: '10:00' }, { start: '02:00', end: '10:00' }) + '<br>'); 
 
document.write(overlapping({ start: '20:00', end: '22:00' }, { start: '20:00', end: '21:00' }) + '<br>'); 
 
document.write(overlapping({ start: '20:00', end: '21:00' }, { start: '20:00', end: '22:00' }) + '<br>'); 
 
document.write(overlapping({ start: '02:00', end: '03:00' }, { start: '01:00', end: '02:30' }) + '<br>'); 
 
document.write(overlapping({ start: '00:00', end: '05:00' }, { start: '05:00', end: '10:00' }) + '<br>'); 
 
document.write(overlapping({ start: '10:00', end: '15:00' }, { start: '00:00', end: '08:00' }) + '<br>');

+0

谢谢,这就是我所需要的 - 但n次。所以我必须将我分成n次,然后迭代?还是有更好的方法来做到这一点?非常感谢 – quma

+0

是的,你必须迭代。另一个解决方案是可以想象的,但需要更多的开销 –

+0

你有什么提示我怎么能做到这一点。分割我的阵列6个区间 - 每个组合 - 做出许多努力并且难以制作?非常感谢 – quma

-1

你必须处理各种情况的重叠,即

start1 ... end1 
start2 ... end2 

start1 ............. end1 
     start2 ..... end2 

start1 ............. end1 
start2 ..... end2 

start1 ... end1 
start2 ........... end2 

     start1 ... end1 
start2 ......... end2 

start1 .......... end1 
     start2 ........... end2 

     start1 .......... end1 
start2 ......... end2 

可以相应的情况写下来与if-then-else

0

当然有你的小时/分钟只是转换为“一天分钟,并执行所有必要的检查:

// convert all your value like this 
var tab = scheduleIntervalContainerWrapper1.start.split(','); 
if(tab[1] < tab[0]){ 
    tab[1]+=24*60;// overlapping on a day 
} 
var startMinuteOfTheDay = parseInt(tab[0]*60)+parseInt(tab[1]); 

关于检查:如果你确定了END1总是大于第二个时间间隔的start1和相同。

if((start1 > start2 && start1 < end2) || (end1 < end2 && end1 > start2))