Проверьте, перезаписывает ли мой диапазон другой диапазон - PullRequest
0 голосов
/ 22 ноября 2018

Допустим, у меня есть диапазон чисел, например: 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 голосов
/ 22 ноября 2018

Вы можете сказать, что новый диапазон не повлияет на диапазон, если:

  1. Либо диапазон заканчивается до запуска нового диапазона. ИЛИ
  2. Диапазон начинается после того, как новый диапазон заканчивается.

В зависимости от этих условий, вы можете иметь функцию, которая сообщает:заданный диапазон: безопасный или нет;

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

By, safe Я имею в виду, перекрываются ли 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)
0 голосов
/ 22 ноября 2018

Вы можете фильтровать, проверяя диапазон.Результат содержит только диапазоны, которые перекрывают данный диапазон.

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; }
0 голосов
/ 22 ноября 2018
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)););
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...