假设我有一个数字范围,例如:5 to 8
然后我有一系列现有范围:
let arrayOfExistingRanges = [
{
id: 1,
start: 1,
end: 2
},
{
id: 2,
start: 1,
end: 5
},
{
id: 3,
start: 5,
end: 6
},
...
]
我想确保我不会用新范围覆盖/覆盖任何现有范围。
基本上获取我的arrayOfExistingRanges
的每个对象,其中我的范围以任何方式与它们重叠。
下面我列出了要检查的可能性列表,但是我想知道是否有比单独检查每种可能性更好的方法。
答案 0 :(得分:1)
您可以说,在以下情况下,范围不会受到新范围的影响:
基于这些条件,您可以使用一个函数来说明给定范围是否安全;
const isSafe =(newRange, existingRange) =>
(existingRange.end <= newRange.start || newRange.end <= existingRange.start );
“安全”是指newRange
和existingRange
是否重叠。如果isSafe
返回true
,则它们不会重叠。
以下是您可以使用filter()
来过滤出重叠范围的方法:
const newRange = { id: 10, start: 2, end: 3 };
const affected = arrayOfExistingRanges.filter((x) => !isSafe(newRange, x));
这是完整的代码:
const isSafe =(newRange, existingRange) =>
(existingRange.end <= newRange.start || newRange.end <= existingRange.start );
const arrayOfExistingRanges = [
{
id: 1,
start: 1,
end: 2
},
{
id: 2,
start: 1,
end: 5
},
{
id: 3,
start: 5,
end: 6
}]
const newRange = { id: 10, start: 2, end: 3 };
const affected = arrayOfExistingRanges.filter((x) => !isSafe(newRange, x));
console.log(affected)
答案 1 :(得分:0)
let arrayOfExistingRanges = [
{
id: 1,
start: 1,
end: 2
},
{
id: 2,
start: 1,
end: 5
},
{
id: 3,
start: 5,
end: 6
}
]
//new range
const n = {
start: 1,
end: 2
}
const notOverlaping = arrayOfExistingRanges.filter((r) => {
return ( n.start >= r.end || n.end <= r.start)
});
console.log(arrayOfExistingRanges.filter(n => !notOverlaping.includes(n)););
答案 2 :(得分:0)
您可以通过检查范围进行过滤。结果仅包含与给定范围重叠的范围。
var ranges = [
{ id: 1, start: 5, end: 8 },
{ id: 2, start: 4, end: 6 },
{ id: 3, start: 7, end: 9 },
{ id: 4, start: 6, end: 7 },
{ id: 5, start: 4, end: 9},
{ id: 6, start: 1, end: 2, out: true },
{ id: 7, start: 11, end: 12, out: true },
{ id: 8, start: 1, end: 5, out: true },
{ id: 9, start: 8, end: 10, out: true },
{ id: 10, start: 5, end: 6 },
{ id: 11, start: 7, end: 8 },
{ id: 12, start: 5, end: 8 },
{ id: 13, start: 5, end: 10 },
{ id: 14, start: 4, end: 8 },
],
start = 5,
end = 8,
overlapping = ranges.filter(o => o.end > start && o.start < end);
console.log(overlapping);
.as-console-wrapper { max-height: 100% !important; top: 0; }