最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

Javascript - Check numeric range overlapping in array - Stack Overflow

programmeradmin6浏览0评论

I have an array of time ranges with start & end values.

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

Need to check whether the selected range overlap the time range or not. And also the selected range should be in between the timeRange intervals. (Ex: 140-180, 220-250)

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

I have an array of time ranges with start & end values.

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

Need to check whether the selected range overlap the time range or not. And also the selected range should be in between the timeRange intervals. (Ex: 140-180, 220-250)

var selected = {
    start: 150,
    end: 170
}
Share Improve this question edited Dec 6, 2017 at 6:08 Vikrant 5,03618 gold badges51 silver badges74 bronze badges asked Dec 6, 2017 at 6:07 Hulk1991Hulk1991 3,16314 gold badges34 silver badges46 bronze badges 1
  • I tried stackoverflow./questions/30472556/… – Hulk1991 Commented Dec 6, 2017 at 6:11
Add a ment  | 

4 Answers 4

Reset to default 14

Time interval B 'overlaps' A if:

  • B starts after A starts but before A finishes.
  • B starts before A starts and finishes after A starts.

So you can write a function which decides exactly that.

function areOverlapping(A, B) {
    if(B.start < A.start) {
        return B.finish > A.start;
    }
    else {
        return B.start < A.finish;
    }
}
 const overlaps = timeRanges.some( range => 
  (range.start < selected.start && range.end > selected.start) || 
  (range.start < selected.end && range.end > selected.end) || 
  (range.start > selected.start && range.end < selected.end)
 );

Assuming that your time ranges are sorted, this solution will work. Otherwise, you need to implement time range sorting as well.

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));

Why don't you run your selection through the array and calculate what you need?

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

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


}
发布评论

评论列表(0)

  1. 暂无评论