2017-12-06 26 views
-3

私は開始時刻が&の最終値の配列を持っています。Javascript - 数値範囲が配列内で重複していないか確認する

var timeRanges = [{ 
    start: 120, 
    end: 140 
},{ 
    start: 180, 
    end: 220 
},{ 
    start: 250, 
    end: 300 
}] 

選択範囲が時間範囲と重複しているかどうかを確認する必要があります。また、選択範囲はtimeRange間隔の間にある必要があります。 (例:140〜180、220〜250)

var selected = { 
    start: 150, 
    end: 170 
} 
+0

あなたは何も試みませんでしたか? –

+0

https://stackoverflow.com/questions/30472556/how-to-find-all-overlapping-ranges-and-partition-them-into-chunks/30473019を試しました – Hulk1991

答えて

1

時間範囲がソートされていると仮定すると、この解決策が有効です。それ以外の場合は、時間範囲ソートも実装する必要があります。

function isValidRange(timeRanges, selectedRange) { 
var isValid = true; 
var minStart = timeRanges[0].start; 
var maxEnd = timeRanges[timeRanges.length - 1].end; 

if(selectedRange.start < selectedRange.end && selectedRange.start > minStart && selectedRange.end < maxEnd) { 
    for(var i=0; i<timeRanges.length; i++) { 
     if((selectedRange.start >= timeRanges[i].start && selectedRange.start <= timeRanges[i].end) 
     || (selectedRange.end >= timeRanges[i].start && selectedRange.end <= timeRanges[i].end)) { 
      isValid = false; 
      break; 
     } 
     else if(i != timeRanges.length - 1) { 
      if(selectedRange.start > timeRanges[i].end && selectedRange.start < timeRanges[i+1].start) { 
       if(selectedRange.end < timeRanges[i+1].start) { 
        break; 
       } 
       else { 
        isValid = false; 
        break; 
       } 
      } 
     } 
    } 
} 
else { 
    isValid = false; 
} 
return isValid; 
} 

var timeRanges = [{ 
    start: 120, 
    end: 140 
},{ 
    start: 180, 
    end: 220 
},{ 
    start: 250, 
    end: 300 
}]; 

var selected = { 
    start: 141, 
    end: 222 
}; 

alert(isValidRange(timeRanges, selected)); 
1
const overlaps = timeRanges.some(range => 
    (range.start < selected.start && range.end > selected.start) || 
    (range.start < selected.end && range.end > selected.end) 
); 
0

は、なぜあなたは、配列を通して、あなたの選択を実行し、何が必要計算しませんか?

timeRanges.forEach(function(aRange, index)) { 

    if (selected.start > aRange.start && selected.end < aRange.end) 
     console.log('Selection falls within the item ' + index): 


} 
0

は、時間間隔Bは、 '' オーバーラップA場合:A開始後でA終了前

  • B開始。
  • BAの前に開始され、Aの開始後に終了して終了します。

これを正確に決定する関数を書くことができます。

function areOverlapping(A, B) { 
    if(B.start < A.start) { 
     return B.finish > A.start; 
    } 
    else { 
     return B.start < A.finish; 
    } 
} 
関連する問題