检查我的范围是否覆盖了另一个范围

时间:2018-11-22 13:06:27

标签: javascript math range

假设我有一个数字范围,例如:5 to 8

然后我有一系列现有范围:

let arrayOfExistingRanges = [
  { 
   id: 1, 
   start: 1, 
   end: 2 
  },
  { 
   id: 2, 
   start: 1, 
   end: 5 
  },
  { 
   id: 3, 
   start: 5, 
   end: 6 
  },
  ...
]

我想确保我不会用新范围覆盖/覆盖任何现有范围。

基本上获取我的arrayOfExistingRanges的每个对象,其中我的范围以任何方式与它们重叠。

下面我列出了要检查的可能性列表,但是我想知道是否有比单独检查每种可能性更好的方法。

enter image description here

3 个答案:

答案 0 :(得分:1)

您可以说,在以下情况下,范围不会受到新范围的影响:

  1. 任一范围在之前完成。 OR
  2. 范围在新范围结束后 开始。

基于这些条件,您可以使用一个函数来说明给定范围是否安全

const isSafe =(newRange, existingRange) => 
   (existingRange.end <= newRange.start || newRange.end <= existingRange.start );

“安全”是指newRangeexistingRange是否重叠。如果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; }