Comment parcourir les lignes et les cellules du tableau en JavaScript?


192

Si j'ai un tableau HTML ... dis

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

Comment puis-je parcourir toutes les lignes du tableau (en supposant que le nombre de lignes puisse changer à chaque fois que je vérifie) et récupérer les valeurs de chaque cellule de chaque ligne à partir de JavaScript?

Réponses:


304

Si vous voulez parcourir chaque ligne ( <tr>), connaître / identifier la ligne ( <tr>), et parcourir chaque colonne ( <td>) de chaque ligne ( <tr>), alors c'est la voie à suivre.

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

Si vous voulez simplement parcourir les cellules ( <td>), en ignorant la ligne sur laquelle vous vous trouvez, alors c'est la voie à suivre.

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
}

3
ex2, table.cells n'est pas compatible avec le navigateur
EricG

8
@WilliamRemacle J'ai posté cette réponse il y a presque 4 ans .. IE 9 n'était même pas une pensée à l'époque!
John Hartsock

@JohnHartsock Je sais mais j'ai utilisé votre solution et j'ai compris qu'elle ne fonctionnait pas sur IE. C'est juste un commentaire pour avertir les autres ... J'ai quand même voté pour votre réponse ;-)
William Remacle

function itTable () {document.writeln ("itTable"); var table = document.getElementById ("mytab"); for (var i = 0, row; row = table.rows [i]; i ++) {document.writeln (i); for (var j = 0, col; col = row.cells [j]; j ++) {document.writeln (j); }} document.writeln ("end-itTable"); } Pourquoi ce code ne me laisserait-il pas parcourir une table similaire à celle ci-dessus.
Doug Hauf

Pour ceux (venant ici via google) qui ont besoin d'un simple et petit shim pour table.cells(pour corriger du code plus ancien / orienté IE), voir ma réponse à Q: Le navigateur Firefox ne reconnaît-il pas table.cells?
GitaarLAB

67

Vous pouvez envisager d'utiliser jQuery. Avec jQuery, c'est super facile et pourrait ressembler à ceci:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})

3
Impossible d'utiliser jquery ... la société ne l'autorise pas. Ne demande pas pourquoi.
GregH

21
C'est une politique folle. Vous pouvez toujours simplement copier-coller les fonctions pertinentes dont vous avez besoin de jQuery dans votre propre code d'application. À moins qu'il y ait une politique contre l'utilisation du code d'autres personnes en ligne, mais alors vous ne seriez pas ici.
Clinton

13
@Judy: Pas d'accord sur la "politique folle" .... il y a de nombreuses raisons pour ne pas utiliser jQuery
Bigjim

JQuery est quelque chose que je n'ai pas utilisé depuis un moment et qui semble en un coup d'œil quelque chose de complexe et difficile à déplacer. Mais je pense que c'est simplement parce que je ne l'ai pas beaucoup utilisé.
Doug Hauf

5
Une autre raison pour interdire JQuery est pour les sites Web intégrés, par exemple j'utilise une puce WiFi intégrée qui ne dispose que de 250 Ko pour l'ensemble du site Web. C'est une compression avec toutes les images telles qu'elles sont.
Nick

16

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>

À chaque passage, l'itérateur de la boucle r / c augmente et un nouvel objet ligne / cellule de la collection est assigné aux variables ligne / cellule. Lorsqu'il n'y a plus de lignes / cellules dans la collection, false est attribué à la variable de ligne / cellule et l'itération à travers la boucle s'arrête (se termine).


dans le post précédent: while (cell = row [r] .cells [c ++] devrait être row.cells [c ++], row étant l'objet courant, et un exemple pour le code sth: mycoldata = cell.innerHTML
fib Littul

12

Essayer

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


2
nettoyer je dirais
Shobi

3

Cette solution a parfaitement fonctionné pour moi

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 = "";
     }
}

Est-ce même du JavaScript? Parce que votre boucle for ressemble un peu à PHP.
aravk33

2
Beaucoup de langues sont étonnamment similaires quand on sait ce qu'il faut rechercher. PHP utiliserait un $ devant chaque variable, ce n'est pas le cas. var est également un mot-clé utilisé par JavaScript, pas par PHP bien que s'ils l'ont ajouté, je l'aurai peut-être manqué. - edit- gah no enter for newline ... Comme je l'ai dit: la logique est universelle. Savoir comment le transcrire dans d'autres langues est une compétence incroyablement utile qui n'est pas difficile à apprendre - nous sommes des êtres intellectuels dotés d'excellentes capacités de correspondance de motifs. Identifiez les changements entre chaque langue ou utilisez simplement la définition du langage lexer ...
Acecool

3

Si vous en voulez un avec un style fonctionnel, comme ceci:

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

Vous pouvez modifier l'objet prototype de HTMLCollection (permettant de l'utiliser d'une manière qui ressemble aux méthodes d'extension en C #) et y incorporer une fonction qui convertit la collection en tableau, permettant d'utiliser des fonctions d'ordre supérieur avec le style ci-dessus (sorte de style linq dans C #):

    Object.defineProperty(HTMLCollection.prototype, "toArray", {
        value: function toArray() {
            return Array.prototype.slice.call(this, 0);
        },
        writable: true,
        configurable: true
    });

Uncaught TypeError: Impossible de lire la propriété 'toArray' de undefined -> C'est ce que j'ai obtenu lorsque j'ai essayé cette solution.
Vineela Thonupunuri

Étrange. Je l'ai essayé à nouveau et cela a fonctionné. Je n'ai cependant pas pu reproduire l'erreur que vous avez signalée. Le problème vient peut-être du navigateur. J'ai testé avec Edge et IE et les deux n'ont pas fonctionné. Chrome, Firefox et Safari ont fonctionné comme prévu.
l30_4l3X

J'ai aussi utilisé du chrome.
Vineela Thonupunuri

Cela fonctionne aussi pour moi. Le Object.definePropertydoit évidemment passer avant le reste du code, mais cela fonctionne. @Vineela Thonupunuri l'avez-vous essayé avec le code dans le bon ordre?
FlippingBinary

3

Meilleure solution: utilisez le natif de Javascript Array.from()et convertissez l'objet HTMLCollection en tableau, après quoi vous pouvez utiliser les fonctions de tableau standard.

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

Vous pouvez également référencer tr.rowIndexetcell.colIndex au lieu d'utiliser row_indet col_ind.

Je préfère de loin cette approche aux 2 réponses les plus votées car elle n'encombre pas votre code de variables globales i,j , rowet col, et donc il fournit un code modulaire propre, qui n'ont pas d' effets secondaires (ou les peluches raise / avertissements du compilateur) ... sans autres bibliothèques (par exemple jquery).

Si vous en avez besoin pour fonctionner dans une ancienne version (pré-ES2015) de Javascript, Array.frompeut être polyfilled.


1

Vous pouvez utiliser .querySelectorAll()pour sélectionner tous les tdéléments, puis les parcourir avec .forEach(). Leurs valeurs peuvent être récupérées avec .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>

Si vous ne voulez sélectionner que des colonnes d'une ligne spécifique, vous pouvez utiliser la pseudo-classe :nth-child()pour sélectionner un spécifique tr, éventuellement en conjonction avec le combinateur enfant ( >) (ce qui peut être utile si vous avez une table dans une table):


1

Utilisation d'une seule boucle for:

var table = document.getElementById('tableID');  
var count = table.rows.length;  
for(var i=0; i<count; i++) {    
    console.log(table.rows[i]);    
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.