Шаг 1: Сначала вы можете создать сопоставленный массив, содержащий значения цвета, которые вы можете получить из селектора table thead th
. Сначала необходимо преобразовать HTMLCollection в массив с помощью ES6 Array.prototype.from , а затем выполнить сопоставление с помощью Array.prototype.map :
const table = document.querySelector('table');
const colors = Array.from(table.querySelectorAll('thead th')).map(th => th.innerText);
p / s: причина использования innerText
состоит в том, что мы не включаем теги HTML, даже если в вашем примере innerHTML
работает так же хорошо. Это просто личное предпочтение.
Шаг 2: Затем вы просто перебираете все элементы table tbody tr
. На каждой итерации вы затем просматриваете все элементы td
, которые можете найти, и с их индексом используйте dataset
, чтобы назначить соответствующий цвет по индексу:
table.querySelectorAll('tbody tr').forEach(tr => {
tr.querySelectorAll('td').forEach((td, i) => {
td.dataset.color = colors[i];
});
});
См. Подтверждение концепции ниже, где ячейки окрашены на основе атрибута data-color
для простоты визуализации (вы также можете проверить DOM, чтобы увидеть добавленные правильные атрибуты HTML5 data-
):
const table = document.querySelector('table');
// Collect colors into an array
const colors = Array.from(table.querySelectorAll('thead th')).map(th => th.innerText);
// Iterate through all `<tr>` elements in `<tbody>
table.querySelectorAll('tbody tr').forEach(tr => {
// Iterate through all `<td>` in a particular row
tr.querySelectorAll('td').forEach((td, i) => {
// Assign color to HTML5 data- attribute
td.dataset.color = colors[i];
});
});
tbody td[data-color="Green"] {
background-color: green;
}
tbody td[data-color="Orange"] {
background-color: orange;
}
<table>
<thead>
<tr>
<th>Green</th>
<th>Orange</th>
</tr>
</thead>
<tbody>
<tr>
<td>First Stage A</td>
<td>First Stage B</td>
</tr>
<tr>
<td>Second Stage A</td>
<td>Second Stage B</td>
</tr>
</tbody>
</table>