Вам необходимо объявить fbdCaption
вне вашего цикла и накапливать в нем значения внутри цикла.Во второй попытке все еще есть проблема:
HTML для обеих "верхних частей" таблицы объединяется в выделенную переменную и затем выводится так, что означает, что вы получаете две вершины сразу после вывода в выводе безстроки данных ниже первого.Аналогичные вещи происходят с двумя другими переменными, которые собирают HTML.Это также означает, что выходная структура HTML на самом деле недопустима.
Это не так сложно исправить, но я предпочитаю другой способ создания элементов HTML: использование методов DOM.
Кроме того, выесть один случай, когда у вас есть больше выходных значений, чем входных значений.Если бы это было иначе, ваш вывод был бы неполным.
Наконец, вы используете некоторые итерационные переменные, не определяя их явно.Это делает их глобальными.
Рабочий код может выглядеть так:
// A helper function to append one table-row containing the given texts (array)
function insertRowWithTexts(table, tag, texts) {
const row = table.insertRow();
for (const text of texts) {
const elem = document.createElement(tag); // Either a TD or a TH
elem.textContent = text === undefined ? "" : text;
row.appendChild(elem);
}
}
function tablesFromDb(data) {
for (const obj of data) {
for (const deviceTitle in obj) {
const { input, output } = obj[deviceTitle];
const table = document.createElement("table");
table.createCaption().textContent = deviceTitle;
insertRowWithTexts(table, "th", ["No", "Input", "Output"]);
for (let k = 0; k < Math.max(input.length, output.length); k++) {
insertRowWithTexts(table, "td", [k+1, input[k], output[k]]);
}
document.getElementById("container").appendChild(table);
}
}
}
var data = [{deviceOne: {input: ["oneInOne", "oneInTwo", "oneInThree", "oneInFour"], output: ["oneOutOne", "oneOutTwo", "oneOutThree"]}},{deviceTwo: {input: ["twoInOne", "twoInTwo", "twoInThree", "twoInFour"],output: ["twoOutOne", "twoOutTwo", "twoOutThree", "twoOutFour"]}}];
document.addEventListener('DOMContentLoaded', () => tablesFromDb(data));
td, th {
border: 1px solid;
}
<div id="container"></div>
Преимущество использования textContent =
в объектах HTML-элемента заключается в том, что он заботится о любом экранировании символов, которое может потребоваться.Например, если текст содержит volt&ere
, он будет должным образом экранирован, поэтому он также будет отображаться так, а не как «вольт и т. Д.» Или что-то еще.