Есть 100 способов сделать это, от innerHTML
до полноценных шаблонов. Вот один из самых простых вариантов:
function tag(name, ...children) {
let t = document.createElement(name);
for (let c of children)
t.appendChild(c);
return t;
}
function text(content) {
return document.createTextNode(content);
}
//
document.body.appendChild(tag('table',
tag('tr',
tag('td', text('cell 1')),
tag('td', text('cell 2')),
tag('td', text('cell 3')),
),
tag('tr',
tag('td', text('cell 4')),
tag('td', text('cell 5')),
tag('td', text('cell 6')),
)
))
Как правило, поскольку HTML является вложенной структурой, циклы (которые являются «плоскими») не являются правильным выбором. Вложенные функции работают лучше всего.