Javascript - 检查数组中重叠的数值范围
Javascript - Check numeric range overlapping in array
我有一个包含开始值和结束值的时间范围数组。
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
}
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)
);
你为什么不通过数组运行你的选择并计算你需要的?
timeRanges.forEach(function(aRange, index)) {
if (selected.start > aRange.start && selected.end < aRange.end)
console.log('Selection falls within the item ' + index):
}
时间间隔B
'overlaps'A
if:
B
在 A
开始之后但在 A
结束之前开始。
B
在 A
开始之前开始,在 A
开始之后结束。
因此您可以编写一个函数来准确决定这一点。
function areOverlapping(A, B) {
if(B.start < A.start) {
return B.finish > A.start;
}
else {
return B.start < A.finish;
}
}
假设您的时间范围已排序,此解决方案将有效。否则,您还需要实现时间范围排序。
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));
我有一个包含开始值和结束值的时间范围数组。
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
}
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)
);
你为什么不通过数组运行你的选择并计算你需要的?
timeRanges.forEach(function(aRange, index)) {
if (selected.start > aRange.start && selected.end < aRange.end)
console.log('Selection falls within the item ' + index):
}
时间间隔B
'overlaps'A
if:
B
在A
开始之后但在A
结束之前开始。B
在A
开始之前开始,在A
开始之后结束。
因此您可以编写一个函数来准确决定这一点。
function areOverlapping(A, B) {
if(B.start < A.start) {
return B.finish > A.start;
}
else {
return B.start < A.finish;
}
}
假设您的时间范围已排序,此解决方案将有效。否则,您还需要实现时间范围排序。
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));