javascript — сортировка данных календаря по дереву json

Мне нужна помощь со следующим,
Вот некоторые данные JSON

[
{
"id"   : 1,
"from" : 10,
"to"   : 11
},
{
"id"   : 2,
"from" : 11,
"to"   : 12
},
{
"id"   : 3,
"from" : 10.5,
"to"   : 11.5
},
{
"id"   : 4,
"from" : 9,
"to"   : 9.5
}
]

Я пытаюсь подготовить данные, подобные этим, я могу отобразить их на экране, чтобы каждый объект содержал 2 дополнительных свойства, sum и col (столбец). Sum — это сумма столбцов (скажем), которые составляют группу, а col — столбец, в котором находится объект. Это пример данных. Поэтому я ищу рекурсивный способ прохождения данных, чтобы установить эти два дополнительных свойства. Данные должны теперь выглядеть так:

[
{
"id"   : 1,
"from" : 10,
"to"   : 11,
"sum"  : 2,
"col"  : 1
},
{
"id"   : 2,
"from" : 11,
"to"   : 12,
"sum"  : 2,
"col"  : 1
},
{
"id"   : 3,
"from" : 10.5,
"to"   : 11.5,
"sum"  : 2,
"col"  : 2
},
{
"id"   : 4,
"from" : 9,
"to"   : 9.5,
"sum"  : 1,
"col"  : 1
}
]

Так как элемент id: 3 from находится между id: 1 и id: 2 from и to, обратите внимание, что свойство sum этих трех элементов равно 2, а столбец id: 3 равен 2. Думаю, это простая версия данные. Может существовать дополнительное вложение, когда, например, дополнительная сумма объекта может быть равна 3, а столбец равен 3.

Я не уверен, что структура данных это напоминает? Какое-то дерево. Как я могу пройти через эти элементы (рекурсивное мышление) и установить эти дополнительные свойства с наименьшей временной сложностью? Может быть, я сортирую первым.

Любое направление или помощь будет принята с благодарностью!

0

Решение

Подход.

Если я правильно понимаю, вам нужно назначить два свойства каждому элементу массива. pos столбец расписания в виде списка. При наличии двух или более совпадающих назначений позиция 1 относится к первому назначению, позиция 2 — ко второму назначению и т. Д.

          pos = 1                           pos = 2
---------------------------     -------------------------------
{ id: 1, from: 10, to: 11 }     { id: 3, from: 10.5, to: 11.5 }
{ id: 2, from: 11, to: 12 }
{ id: 4, from: 12, to: 13 }

sum это то, что я думаю, я понял, подсчет одновременных назначений.

Для первой части решение использует вспомогательную переменную schedule, Эта переменная имитирует таблицу с назначениями. В каждом массиве все встречи не перекрываются. Размер массива соответствует желаемому pos,

Вторая часть вычисляет sumпоказатель того, сколько назначений может даже состояться одновременно. Здесь используется наибольшее количество.

Алгоритм нуждается в отсортированных данных.

Первый массив в результате — это расписание.
Второй — это оригинальный массив, отсортированный и добавленный с требуемыми свойствами pos а также sum,

var data = [
{ id: 1, from: 10, to: 11 },
{ id: 3, from: 10.5, to: 11.5 },
{ id: 2, from: 11, to: 12 },
{ id: 4, from: 12, to: 13 },
],
schedule = [];

data.sort(function (a, b) { return a.from - b.from || a.to - b.to; });

data.forEach(function (a, i) {
schedule.some(function (b, j) {
if (b.length && b[b.length - 1].to <= a.from) {
b.push(a);
return true;
}
}) || schedule.push([a]);
});

schedule.forEach(function (a, i) {
a.forEach(function (b) {
b.pos = i + 1;
});
})

data.forEach(function (a, i, aa) {
var j, sum = 1;
while (i + sum < data.length && data[i + sum].from < a.to && a.to <= data[i + sum].to) {
sum++;
}
for (j = i; j < i + sum; j++) {
if (!(aa[j].sum >= sum)) {
aa[j].sum = sum;
}
}
});

document.write('<pre>' + JSON.stringify(schedule, 0, 4) + '</pre>');
document.write('<pre>' + JSON.stringify(data, 0, 4) + '</pre>');
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]