Как перебрать строки и ячейки таблицы в JavaScript? - PullRequest
163 голосов
/ 18 июня 2010

Если у меня есть таблица HTML ... скажем,

<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?

Ответы [ 7 ]

259 голосов
/ 18 июня 2010

Если вы хотите пройти по каждой строке (<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
}
58 голосов
/ 18 июня 2010

Вы можете рассмотреть возможность использования jQuery.С jQuery это очень просто и может выглядеть так:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})
10 голосов
/ 12 ноября 2012

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>

При каждом проходе, пока итератор цикла r / c увеличивается, и новая строка / ячейка из коллекции назначается переменным строки / ячейки.Когда в коллекции больше нет строк / ячеек, false присваивается строке / ячейке и повторяется, пока цикл останавливается (выходит).

4 голосов
/ 02 июля 2018

Попробуйте

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>

for (let [i,row] of [...mytab1.rows].entries()) 
{
    for(let [j,cell] of [...row.cells].entries()) 
    {
       console.log(`[${i},${j}] = ${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>
1 голос
/ 17 июня 2016

Это решение отлично сработало для меня

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 = "";
     }
}
0 голосов
/ 02 июня 2019

Если вам нужен функциональный стиль, например:

    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 (позволяющий использовать способ, похожий на методы расширения в C #) и встроить в негофункция, которая преобразует коллекцию в массив, позволяя использовать функции более высокого порядка с указанным стилем (вид стиля linq в C #):

    Object.defineProperty(HTMLCollection.prototype, "toArray", {
        value: function toArray() {
            return Array.prototype.slice.call(this, 0);
        },
        writable: true,
        configurable: true
    });
0 голосов
/ 04 марта 2019

Вы можете использовать .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>

Если вы хотите выбирать столбцы только из определенной строки, вы можете использовать псевдокласс :nth-child() для выбора конкретного tr, опционально в сочетании с дочерним комбинатором (>) (что может быть полезно, если у вас есть таблица в таблице):

const cells = document.querySelectorAll('tr:nth-child(2) > 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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...