Здесь важно определить структуру данных, чтобы вы могли рекурсивно атаковать проблему.
В вашем случае ваши группы можно определить так:
{
groupID: string,
sys?: string[],
grp?: IGroup[]
}
(где IGroup
определил вышеуказанную структуру)
Все группы имеют groupID
, некоторые имеют sys
, а некоторые имеют grp
детей.
Отсюда мы можем определить функцию, в которой логика выглядит следующим образом:
- Создать двухстрочную структуру для текущей группы.
- Для каждого
sys
дочернего элементаэлемент (если они существуют), добавьте ячейку в верхнюю строку со значением sys
. - Для каждого дочернего элемента
grp
(если он существует), вызовите эту функцию и добавьте возвращающую структуру кячейка в верхнем ряду. - Вставьте ячейку в нижний ряд на ширине colspan дочернего элемента.Установите для содержимого ячейки текущее значение
grp
groupID
- Возврат двухстрочного элемента структуры, либо ввод в процесс рекурсивной сборки, либо в качестве окончательного результата.
Здесьгрубая реализация вышеперечисленных пунктов:
function groupToHTML(grp) {
//Table to append to and return
var container = document.createElement("table");
container.border = "1";
container.style.borderCollapse = "collapse";
//Insert row to children of this node
var childRow = container.appendChild(document.createElement("tr"));
//Append all "sys" elements as cells
if (grp.sys !== void 0) {
for (var sysIndex = 0; sysIndex < grp.sys.length; sysIndex++) {
var sys = grp.sys[sysIndex];
var sysCell = childRow.appendChild(document.createElement("td"));
sysCell.innerHTML = sys;
sysCell.style.backgroundColor = "red";
sysCell.style.verticalAlign = "bottom";
}
}
//Append all "grp" children by calling "groupToHTML" on them and appending the returning table
if (grp.grp !== void 0) {
for (var grpIndex = 0; grpIndex < grp.grp.length; grpIndex++) {
var child = grp.grp[grpIndex];
var grpCell = childRow.appendChild(document.createElement("td"));
grpCell.appendChild(groupToHTML(child));
grpCell.style.verticalAlign = "bottom";
}
}
//Add a row and cell for "this" grp
var thisRow = container.appendChild(document.createElement("tr"));
var thisCell = thisRow.appendChild(document.createElement("th"));
thisCell.innerHTML = grp.groupID;
thisCell.style.textAlign = "center";
//Set cell colspan to number of child elements
thisCell.colSpan = Math.max(1, (grp.grp !== void 0 ? grp.grp.length : 0) + (grp.sys !== void 0 ? grp.sys.length : 0));
//Return table
return container;
}
//TEST
//testdata
var data = {
groupID: 'group-1',
grp: [
{
groupID: 'group-2',
grp: [
{
groupID: 'group-3',
sys: ['sys1', 'sys2', 'sys3']
}, {
groupID: 'group-4',
grp: [
{
groupID: 'group-5',
sys: ['sys4', 'sys5', 'sys6']
}, {
groupID: 'group-6',
grp: [
{
groupID: 'group-7',
sys: ['sys7', 'sys8', 'sys9']
}
]
}
]
}
],
sys: ['sys0']
}
]
};
//Initiate
var node = groupToHTML(data);
//Append
document.body.appendChild(node);