Como iterar nas linhas e células da tabela em JavaScript?

190

Se eu tiver uma tabela HTML ... diga

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

Como eu itera através de todas as linhas da tabela (assumindo que o número de linhas possa mudar cada vez que eu checo) e recupero valores de cada célula em cada linha no JavaScript?

GregH
fonte

Respostas:

301

Se você deseja percorrer cada linha ( <tr>), conhecer / identificar a linha ( <tr>) e percorrer cada coluna ( <td>) de cada linha ( <tr>), então este é o caminho a seguir.

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

Se você quiser apenas percorrer as células ( <td>), ignorando em qual linha está, então este é o caminho a seguir.

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
}
John Hartsock
fonte
3
ex2, table.cells não é compatível com navegador
EricG
7
@WilliamRemacle Eu publiquei esta resposta quase 4 anos atrás. O IE 9 não era nem um pensamento na época!
John Hartsock
@JohnHartsock Eu sei, mas usei sua solução e descobri que ela não funciona no IE. É apenas um comentário para avisar os outros ... Eu votei-se a sua resposta de qualquer maneira ;-)
William Remacle
função itTable () {document.writeln ("itTable"); var tabela = document.getElementById ("mytab"); for (var i = 0, linha; linha = tabela.as linhas [i]; i ++) {document.writeln (i); for (var j = 0, col; col = row.cells [j]; j ++) {document.writeln (j); }} document.writeln ("end-itTable"); } Por que esse código não me deixou percorrer uma tabela semelhante à acima.
Doug Hauf
Para aqueles que estão vindo aqui pelo google e precisam de um calço simples e pequeno para table.cells(para corrigir algum código antigo / orientado para o IE), consulte minha resposta para P: O navegador Firefox não reconhece table.cells?
GitaarLAB
65

Você pode considerar o uso do jQuery. Com o jQuery, é super fácil e pode ser assim:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})
dzida
fonte
3
Não é possível usar o jquery ... a empresa não permite. Não pergunte o porquê.
GregH
21
Essa é uma política maluca. Você sempre pode copiar e colar as funções relevantes necessárias do jQuery para o seu próprio código de aplicativo. A menos que exista uma política contra o uso do código de outras pessoas online, mas você não estaria aqui.
Clinton
13
@Judy: Discordam sobre "A política louco" .... há uma abundância de razões para não usar jQuery
Bigjim
O JQuery é algo que eu não uso há algum tempo e parece, de relance, algo complexo e difícil de entender. Mas acho que é porque não o utilizei tanto.
Doug Hauf 22/03
5
Outro motivo para recusar o JQuery é para sites incorporados, por exemplo, estou usando um chip WiFi incorporado que possui apenas 250Kb para todo o site. É um aperto com todas as imagens como são.
19415 Nick
15

var table=document.getElementById("mytab1");
var r=0; //start counting rows in table
while(row=table.rows[r++])
{
  var c=0; //start counting columns in row
  while(cell=row.cells[c++])
  {
    cell.innerHTML='[R'+r+'C'+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>

Em cada passagem, enquanto o iterador do loop r / c aumenta e o novo objeto de linha / célula da coleção é atribuído às variáveis ​​de linha / célula. Quando não há mais linhas / células na coleção, false é atribuído à variável de linha / célula e a iteração ocorre enquanto o loop para (sai).

sbrbot
fonte
na postagem anterior: while (cell = linha [r] .cells [c ++] deve ser row.cells [c ++], a linha sendo o objeto atual e um exemplo para o código sth: mycoldata = cell.innerHTML
fib Littul
12

Experimentar

for (let row of mytab1.rows) 
{
    for(let cell of row.cells) 
    {
       let val = cell.innerText; // your code below
    }
}

Kamil Kiełczewski
fonte
2
limpo, eu diria #
Shobi
3

Esta solução funcionou perfeitamente para mim

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 = "";
     }
}
Karim O.
fonte
Isso é mesmo JavaScript? Porque o seu loop for se parece com o PHP.
Aravk33
2
Muitos idiomas são surpreendentemente semelhantes quando você sabe o que procurar. O PHP usaria um $ na frente de cada variável, isso não acontece. var também é uma palavra-chave usada pelo JavaScript, não pelo PHP, embora, se a adicionaram, eu a tenha perdido. - edit- gah no enter for newline ... Como eu digo: a lógica é universal. Saber transcrevê-lo para idiomas alternativos é uma habilidade incrivelmente útil que não é difícil de aprender - somos seres intelectuais com excelentes habilidades de correspondência de padrões. Identifique as mudanças entre cada idioma ou simplesmente use a definição de idioma lexer ...
Acecool
3

Se você quer um com um estilo funcional, assim:

    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"]

Você pode modificar o objeto protótipo de HTMLCollection (permitindo usar de maneira semelhante aos métodos de extensão em C #) e incorporar nele uma função que converte coleção em matriz, permitindo usar funções de ordem superior com o estilo acima (tipo de estilo linq em C #):

    Object.defineProperty(HTMLCollection.prototype, "toArray", {
        value: function toArray() {
            return Array.prototype.slice.call(this, 0);
        },
        writable: true,
        configurable: true
    });
l30_4l3X
fonte
Não detectado TypeError: Não é possível ler a propriedade 'toArray' de undefined -> Foi o que obtive quando tentei esta solução.
Vineela Thonupunuri
Estranho. Eu tentei novamente e funcionou. Não consegui reproduzir o erro que você apontou. Talvez o problema seja o navegador. Testei usando o Edge e o IE e ambos não funcionaram. Chrome, Firefox e Safari funcionaram como esperado.
L30_4l3X 22/10/19
Eu também usei cromo.
Vineela Thonupunuri
Isso funciona para mim também. oObject.defineProperty obviamente tem que ir antes do resto do código, mas funciona. @Vineela Thonupunuri você tentou com o código na ordem correta?
precisa
3

Melhor solução: use o nativo do Javascript Array.from()e converta o objeto HTMLCollection em uma matriz, após o qual você pode usar as funções padrão da matriz.

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);
        });
    });
}

Você também pode fazer referência tr.rowIndexe, em cell.colIndexvez de usar row_inde col_ind.

Eu prefiro muito mais esta abordagem ao longo do topo 2 mais votado respostas porque não encher o seu código com variáveis globais i, j, rowe col, e, portanto, fornece um código limpo e modular que não terá quaisquer efeitos secundários (ou fiapos raise / avisos do compilador) ... sem outras bibliotecas (por exemplo, jquery).

Se você precisar que ele seja executado em uma versão antiga (pré-ES2015) do Javascript, Array.frompoderá ser preenchido com polyfilled.

mwag
fonte
1

Você pode usar .querySelectorAll()para selecionar todos os tdelementos e, em seguida, fazer um loop sobre eles com .forEach(). Seus valores podem ser recuperados com .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>

Se você deseja selecionar apenas colunas de uma linha específica, pode usar a pseudo-classe :nth-child()para selecionar uma específica tr, opcionalmente em conjunto com o combinador filho ( >) (que pode ser útil se você tiver uma tabela em uma tabela):

Idade da obsidiana
fonte
1

Usando um loop for único:

var table = document.getElementById('tableID');  
var count = table.rows.length;  
for(var i=0; i<count; i++) {    
    console.log(table.rows[i]);    
}
Foram Shah
fonte