Как перебирать строки и ячейки таблицы в JavaScript?
Если у меня есть таблица HTML... say
<div id="myTabDiv">
<table name="mytab" id="mytab1">
<tr>
<td>col1 Val1</td>
<td>col2 Val2</td>
</tr>
<tr>
<td>col1 Val3</td>
<td>col2 Val4</td>
</tr>
</table>
</div>
Как бы я перебирал все строки таблицы (предполагая, что количество строк может меняться каждый раз, когда я проверяю) и извлекать значения из каждой ячейки каждой строки из JavaScript?
Ответы
Ответ 1
Если вы хотите пройти через каждую строку (<tr>
), зная/идентифицируя строку (<tr>
) и повторяя каждый столбец (<td>
) каждой строки (<tr>
), тогда это путь.
var table = document.getElementById("mytab1");
for (var i = 0, row; row = table.rows[i]; i++) {
//iterate through rows
//rows would be accessed using the "row" variable assigned in the for loop
for (var j = 0, col; col = row.cells[j]; j++) {
//iterate through columns
//columns would be accessed using the "col" variable assigned in the for loop
}
}
Если вы просто хотите пройти через ячейки (<td>
), игнорируя, в какой строке вы находитесь, тогда это путь.
var table = document.getElementById("mytab1");
for (var i = 0, cell; cell = table.cells[i]; i++) {
//iterate through cells
//cells would be accessed using the "cell" variable assigned in the for loop
}
Ответ 2
Вы можете использовать jQuery. С jQuery это супер-легко и может выглядеть так:
$('#mytab1 tr').each(function(){
$(this).find('td').each(function(){
//do your stuff, you can use $(this) to get current cell
})
})
Ответ 3
var table=document.getElementById("mytab1");
var r=0;
while(row=table.rows[r++])
{
var c=0;
while(cell=row.cells[c++])
{
cell.innerHTML='[Row='+r+',Col='+c+']'; // do sth with cell
}
}
<table id="mytab1">
<tr>
<td>A1</td><td>A2</td><td>A3</td>
</tr>
<tr>
<td>B1</td><td>B2</td><td>B3</td>
</tr>
<tr>
<td>C1</td><td>C2</td><td>C3</td>
</tr>
</table>
Ответ 4
Пытаться
for (let row of mytab1.rows)
{
for(let cell of row.cells)
{
let val = cell.innerText; // your code below
}
}
for (let row of mytab1.rows)
{
for(let cell of row.cells)
{
console.log(cell.innerText)
}
}
<div id="myTabDiv">
<table name="mytab" id="mytab1">
<tr>
<td>col1 Val1</td>
<td>col2 Val2</td>
</tr>
<tr>
<td>col1 Val3</td>
<td>col2 Val4</td>
</tr>
</table>
</div>
Ответ 5
Это решение отлично сработало для меня
var table = document.getElementById("myTable").rows;
var y;
for(i = 0; i < # of rows; i++)
{ for(j = 0; j < # of columns; j++)
{
y = table[i].cells;
//do something with cells in a row
y[j].innerHTML = "";
}
}
Ответ 6
Лучшее решение: использовать нативный Javascript Array.from()
и конвертировать объект HTMLCollection в массив, после чего вы можете использовать стандартные функции массива.
var t = document.getElementById('mytab1');
if(t) {
Array.from(t.rows).forEach((tr, row_ind) => {
Array.from(tr.cells).forEach((cell, col_ind) => {
console.log('Value at row/col [' + row_ind + ',' + col_ind + '] = ' + cell.textContent);
});
});
}
Вы также можете ссылаться на tr.rowIndex
и cell.colIndex
вместо использования row_ind
и col_ind
.
Я очень предпочитаю этот подход, а не два наиболее популярных ответа, потому что он не загромождает ваш код глобальными переменными i
, j
, row
и col
, и, следовательно, он обеспечивает чистый модульный код, который не будет иметь побочные эффекты (или выдавать предупреждения lint/compiler)... без других библиотек (например, jquery).
Если вам требуется это для запуска в старой версии (до ES2015) Javascript, Array.from
может быть заполнен.
Ответ 7
Вы можете использовать .querySelectorAll()
чтобы выбрать все элементы td
, а затем зациклить их с помощью .forEach()
. Их значения могут быть получены с помощью .innerHTML
:
const cells = document.querySelectorAll('td');
cells.forEach(function(cell) {
console.log(cell.innerHTML);
})
<table name="mytab" id="mytab1">
<tr>
<td>col1 Val1</td>
<td>col2 Val2</td>
</tr>
<tr>
<td>col1 Val3</td>
<td>col2 Val4</td>
</tr>
</table>
Ответ 8
Если вам нужен функциональный стиль, например:
const table = document.getElementById("mytab1");
const cells = table.rows.toArray()
.flatMap(row => row.cells.toArray())
.map(cell => cell.innerHTML); //["col1 Val1", "col2 Val2", "col1 Val3", "col2 Val4"]
Вы можете изменить объект-прототип HTMLCollection (позволяя использовать таким образом, который напоминает методы расширения в С#) и встроить в него функцию, которая преобразует коллекцию в массив, позволяя использовать функции более высокого порядка с указанным выше стилем (вид стиль linq в С#):
Object.defineProperty(HTMLCollection.prototype, "toArray", {
value: function toArray() {
return Array.prototype.slice.call(this, 0);
},
writable: true,
configurable: true
});