Мне нужно разбить массив объектов на двумерный массив, где одномерные массивы будут состоять из объектов, атрибуты которых «для» и «до» не перекрывают интервалы.
Пример: Данный массив arr1 я хочу получить arr2
const arr1 = [
{
from: 0,
to: 2,
},
{
from: 0,
to: 6,
},
{
from: 3,
to: 7,
},
{
from: 2,
to: 4,
},
]
arr2 = [
[
{
from: 0,
to: 2,
},
{
from: 3,
to: 7,
}
],
[
{
from: 0,
to: 6,
}
],
[
{
from: 2,
to: 4,
}
],
]
Как это должно работать: Мы перебираем arr1. Object1 должен быть помещен в первый одномерный массив в arr2 по умолчанию.
Object2 перекрывается с Object1, поэтому его следует поместить в отдельный массив в arr2.
Object3 не перекрывает Object1, поэтому его следует поместить в первый одномерный массив с Object1.
Object4 перекрывается с Object1, поэтому его следует поместить во второй одномерный массив по отношению к Object3, но он также перекрывается с Object3, поэтому его следует поместить в отдельный одномерный массив.
Мне нужно найти решение с как можно меньшим количеством петель)
@epascarello сначала сортирует, затем делает циклы, сравнивая object.from со следующим object.to, но, честно говоря, понятия не имеет, как это решить (
Пожалуйста, добавьте желаемый результат.
@NinaScholz, это там.... Это arr2
надо читать вопросы...
Вы можете перебрать массив результатов и найти слот, если все элементы не перекрываются.
const
array = [{ from: 0, to: 2 }, { from: 0, to: 6 }, { from: 3, to: 7 }, { from: 2, to: 4 }],
result = array.reduce((r, o) => {
if (!r) return [[o]];
const group = r.find(a => a.every(({ from, to }) => o.to <= from || to <= o.from));
if (group) group.push(o);
else r.push([o]);
return r;
}, undefined);
console.info(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Это известно как проблема интервального разбиения
Вот реализация жадного алгоритма:
var arr1 = [
{
from: 0,
to: 2,
},
{
from: 0,
to: 6,
},
{
from: 3,
to: 7,
},
{
from: 2,
to: 4,
},
];
function partitionIntervals(data){
var copy = [...data];
copy.sort((a, b) => a.from - b.from);
var res = [];
outer: for(var x of copy){
for(var slot of res){ // add to the first open slot
if (slot[slot.length - 1].to <= x.from){
slot.push(x);
continue outer;
}
}
res.push([x]); // else create a new slot
}
return res;
}
arr2 = partitionIntervals(arr1);
console.info(arr2)
Так ты что-нибудь пробовал?