Мне нужна помощь со следующим,
Вот некоторые данные 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.
Я не уверен, что структура данных это напоминает? Какое-то дерево. Как я могу пройти через эти элементы (рекурсивное мышление) и установить эти дополнительные свойства с наименьшей временной сложностью? Может быть, я сортирую первым.
Любое направление или помощь будет принята с благодарностью!
Подход.
Если я правильно понимаю, вам нужно назначить два свойства каждому элементу массива. 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>');
Других решений пока нет …