2016-04-26 131 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))