Хорошо, я решил вашу проблему!
Итак, чтобы получить годы из вашей таблицы, я сделал простую функцию, которая просто возвращает годы из вашего statistics table header
вместо использования предопределенный uniqueYears = [2016, 2017, 2018]
, но не стесняйтесь использовать его, если вам нужно.
Обс .: Преимущество использования этой функции заключается в том, что вам не нужно обновлять заголовок года и массив uniqueYears, обновлять только заголовки таблицы html и получать новые данные для все.
function getYears() {
let years = [];
for(const cell of document.querySelectorAll("[data-statistics='year'] th")) {
if(cell.innerText.trim() !== "") years.push(parseInt(cell.innerText));
}
return years;
}
Так что, если вы решите использовать вышеуказанную функцию, убедитесь, что у вас в таблице html это, data-statistics="year"
требуется для функции.
<thead>
<tr data-statistics="year">
<th></th>
<th>2016</th>
<th>2017</th>
<th>2018</th>
</tr>
</thead>
Сразу после этого, чтобы получить записи каждого из ваших данных, вы можете использовать Object.entries () , который дает вам key
и entry
каждого свойства ваш объект. Array.prototype.splice () предназначен для удаления свойства type
, фокусируясь только на статистических данных.
for(const Plan of PensionPlanSummary) {
let PlanEntries = Object.entries(Plan);
PlanEntries = PlanEntries.splice(1, PlanEntries.length - 1);
for(const pe of PlanEntries) {
// pe[0] -> Title
// pe[1] -> Data
getRow(pe[0], pe[1]);
}
}
Затем с вашими записями с помощью простых циклов for вы можете Получите ваши данные, добавив все в <td>Data</td>
и верните строку html
;
function getRow(index = "", data = null) {
let years = getYears(); // Use your uniqueYears array here.
let html = "<tr>"
// Sort by year
data = data.slice(0);
data.sort((a, b) => {
return a.Year - b.Year;
})
html += `<td>${index}</td>`;
for (const d of data) {
while (years.length !== 0) {
if (d.Year === years[0]) {
html += `<td>${d.Value}</td>`;
years.shift();
break;
} else {
html += `<td>-</td>`;
}
years.shift();
}
}
html += "</tr>";
// console.log(html);
return html;
}
Окончательный результат будет таким: html:
<tr>
<td>Participants</td>
<td>-</td>
<td>-</td>
<td>425</td>
</tr>
Или за 2 года данные участников:
<tr>
<td>Participants</td>
<td>-</td>
<td>389</td>
<td>252</td>
</tr>
Теперь вам нужно только добавить в свой html, как вы хотите, взгляните на JsFiddle , если вам нужно.
It немного грязный код, но надеюсь, он поможет!