Как перебирать строки и ячейки таблицы в 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
    });