@fillpower

Как найти пересечения элементов в массиве?

Есть 2 двумерных массива с началом и концом интервала:
[[8, 12], [17, 22]],
[[5, 11], [14, 18], [20, 23]]

Нужно найти пересечения между интервалами массивов.
Ответ: [[8, 11], [17, 18], [20, 22]]
  • Вопрос задан
  • 113 просмотров
Решения вопроса 1
const a = [[8, 12], [17, 22]];
const b = [[5, 11], [14, 18], [20, 23]];

const result = a.reduce((acc, rangeA) => {
  
  return b.reduce((list, rangeB) => {

    if (rangeA[0] >= rangeB[1] || rangeA[1] <= rangeB[0]) {
      return list;
    }

    const from = Math.max(rangeA[0], rangeB[0]);
    const to = Math.min(rangeA[1], rangeB[1]);

    return [...list, [from, to]];
  }, acc);

}, []);
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
WblCHA
@WblCHA
Альтернативный вариант:
const arr1 = [[8, 12], [17, 22]];
  const arr2 = [[5, 11], [14, 18], [20, 23]];
  
  const result = arr1.reduce((acc, range1) => {
    arr2.forEach((range2) => {
      const rangeLength1 = range2[1] - range1[0];
      const rangeLength2 = range1[1] - range2[0];
      
      if(rangeLength1 < rangeLength2) {
        if(rangeLength1 < 0) {
          return;
        }
        
        acc.push([range1[0], range2[1]]);
        return;
      }
      
      if(rangeLength2 < 0) {
        return;
      }
      
      acc.push([range2[0], range1[1]]);
    });
    
    return acc;
  }, []);
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Artezio Нижний Новгород
от 130 000 до 180 000 ₽
Artezio Москва
от 160 000 до 220 000 ₽
XPOWER Одесса
от 3 000 до 5 500 $