2017-12-06 24 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; 
    } 
}