если прям нужно получить максимум отрезков не одной из ордеров, то можно так:
<pre>
<script>
const data = [
{
x1: 1,
x2: 4,
order: 0
},
{ // Добавил этот
x1: 5,
x2: 11,
order: 0
},
{
x1: 7,
x2: 10,
order: 0
},
{
x1: 5,
x2: 8,
order: 0
},
{
x1: 10,
x2: 13,
order: 0
},
{
x1: 8,
x2: 11,
order: 0
},
{
x1: 8,
x2: 11,
order: 0
}
];
function updateOrders(data) {
if (!data || !data.length) {
return;
}
const arr = data.slice().sort((a, b) => a.x2 - b.x2);
let order = 1;
while (arr.length) {
let lastX2 = -Infinity;
let p = 0;
for (let i = 0; i < arr.length; ++i) {
const item = arr[p] = arr[i];
if (item.x1 >= lastX2) {
lastX2 = item.x2;
item.order = order;
} else {
p++;
}
}
arr.length = p;
order++;
}
}
updateOrders(data);
document.write(JSON.stringify(data, "", 2))
</script>
</pre>
но тут уже асимптотика в худшем случае будет O(N^2).
сортируем по х2, далее обходим массив и заполняем первый ордер (заполненные выкидываются из отсортированного массива). Если массив не опустел, повторяем. Худший случай - когда будет N ордеров, по одному в каждом: каждый раз, добавив первый поинт в ордер, придется бесполезно обойти все другие оставшиеся поинты.