Javascript - 检查数组中的数值范围重叠

时间:2017-12-06 06:07:23

标签: javascript arrays sorting range overlapping

我有一系列时间范围,包括start&结束价值。

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
}

4 个答案:

答案 0 :(得分:3)

 const overlaps = timeRanges.some( range => 
  (range.start < selected.start && range.end > selected.start) || 
  (range.start < selected.end && range.end > selected.end)
 );

答案 1 :(得分: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));

答案 2 :(得分:0)

为什么不在数组中运行您的选择并计算您需要的内容?

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

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


}

答案 3 :(得分:0)

时间间隔B&#39;重叠&#39; A如果:

  • BA开始后A完成之前开始。
  • BA开始之前开始,在A开始之后结束。

所以你可以编写一个确切地决定它的函数。

function areOverlapping(A, B) {
    if(B.start < A.start) {
        return B.finish > A.start;
    }
    else {
        return B.start < A.finish;
    }
}