249 votes

Comment itérer dans les lignes et les cellules d'un tableau en JavaScript ?

Si j'ai un tableau HTML...disons

<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 itérer dans toutes les lignes du tableau (en supposant que le nombre de lignes puisse changer à chaque vérification) et récupérer les valeurs de chaque cellule de chaque ligne à partir de JavaScript ?

388voto

John Hartsock Points 36565

Si vous voulez passer par chaque ligne( <tr> ), connaître/identifier la ligne ( <tr> ), et itérer à travers 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 juste passer par les cellules( <td> ), sans tenir compte de la rangée 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
}

7 votes

Ex2, table.cells n'est pas compatible avec le navigateur

10 votes

@WilliamRemacle J'ai posté cette réponse il y a presque 4 ans IE 9 n'était même pas envisagé à l'époque !

0 votes

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

81voto

Lukasz Dziedzia Points 4134

Vous pouvez envisager d'utiliser jQuery. Avec jQuery, c'est très facile et cela peut ressembler à ceci :

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

3 votes

Je ne peux pas utiliser Jquery... la société ne l'autorise pas. Ne demandez pas pourquoi.

25 votes

C'est une politique folle. Vous pouvez toujours copier-coller les fonctions pertinentes dont vous avez besoin de jQuery dans le code de votre propre application. À moins qu'il n'existe une politique interdisant l'utilisation du code d'autrui en ligne, mais alors vous ne seriez pas ici.

19 votes

@Judy : Je ne suis pas d'accord avec la "politique folle" ..... Il existe de nombreuses raisons de ne pas utiliser jQuery.

40voto

Kamil Kiełczewski Points 6496

Essayez

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>

17voto

sbrbot Points 939
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 de la boucle while, l'itérateur r/c augmente et un nouvel objet rangée/cellule de la collection est attribué aux variables rangée/cellule. Quand il n'y a plus de rangées/cellules dans la collection, false est assigné à la variable row/cell et l'itération dans la boucle while s'arrête (sortie).

0 votes

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 sth code : mycoldata = cell.innerHTML

13voto

mwag Points 1

Meilleure solution : utiliser la fonction native de Javascript Array.from() et pour convertir l'objet HTMLCollection en un 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 faire référence à tr.rowIndex et cell.colIndex au lieu d'utiliser row_ind et col_ind .

Je préfère de loin cette approche aux deux réponses les plus votées car elle n'encombre pas votre code de variables globales. i , j , row et col Il fournit donc un code propre et modulaire qui n'aura pas d'effets secondaires (et ne déclenchera pas d'avertissements de la part du compilateur)... sans autres bibliothèques (par exemple, jquery).

Si vous avez besoin d'exécuter ce programme dans une ancienne version (antérieure à ES2015) de Javascript, Array.from peuvent être polychargés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X