Wie iteriere ich in JavaScript durch Tabellenzeilen und -zellen?

190

Wenn ich eine HTML-Tabelle habe ... sagen Sie

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

Wie würde ich alle Tabellenzeilen durchlaufen (vorausgesetzt, die Anzahl der Zeilen könnte sich bei jeder Überprüfung ändern) und Werte aus jeder Zelle in jeder Zeile aus JavaScript abrufen?

GregH
quelle

Antworten:

299

Wenn Sie jede Zeile ( <tr>) durchgehen, die Zeile ( ) kennen / identifizieren <tr>und jede Spalte ( <td>) jeder Zeile ( <tr>) durchlaufen möchten , ist dies der richtige Weg.

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

Wenn Sie nur die Zellen ( <td>) durchgehen und ignorieren möchten, in welcher Zeile Sie sich befinden, ist dies der richtige Weg.

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
quelle
3
ex2, table.cells ist nicht browserkompatibel
EricG
7
@WilliamRemacle Ich habe diese Antwort vor fast 4 Jahren gepostet. IE 9 war damals noch nicht einmal ein Gedanke!
John Hartsock
@ JohnHartsock Ich weiß, aber ich habe Ihre Lösung verwendet und herausgefunden, dass es im IE nicht funktioniert. Es ist nur ein Kommentar, um die anderen zu warnen ... Ich habe Ihre Antwort trotzdem abgestimmt ;-)
William Remacle
Funktion itTable () {document.writeln ("itTable"); var table = document.getElementById ("mytab"); für (var i = 0, row; row = table.rows [i]; i ++) {document.writeln (i); für (var j = 0, col; col = row.cells [j]; j ++) {document.writeln (j); }} document.writeln ("end-itTable"); } Warum sollte ich mit diesem Code nicht eine Tabelle durchlaufen, die der obigen ähnlich ist?
Doug Hauf
Für diejenigen (die über Google hierher kommen), die eine einfache und kleine Unterlegscheibe benötigen table.cells(um älteren / IE-orientierten Code zu patchen), siehe meine Antwort auf Frage: Erkennt der Firefox-Browser table.cells nicht?
GitaarLAB
65

Sie können die Verwendung von jQuery in Betracht ziehen. Mit jQuery ist es super einfach und könnte so aussehen:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})
dzida
quelle
3
Ich kann jquery nicht verwenden ... die Firma erlaubt es nicht. Fragen Sie nicht warum.
GregH
21
Das ist eine verrückte Politik. Sie können die relevanten Funktionen, die Sie von jQuery benötigen, jederzeit einfach in Ihren eigenen Anwendungscode kopieren und einfügen. Es sei denn, es gibt eine Richtlinie gegen die Online-Verwendung des Codes anderer Personen, aber dann wären Sie nicht hier.
Clinton
13
@ Judy: Nicht einverstanden mit "verrückten Richtlinien" .... es gibt viele Gründe, jQuery nicht zu verwenden
Bigjim
JQuery ist etwas, das ich seit einiger Zeit nicht mehr verwendet habe und das auf den ersten Blick komplex und nicht einfach zu handhaben ist. Aber ich denke, das liegt nur daran, dass ich es nicht so oft verwendet habe.
Doug Hauf
5
Ein weiterer Grund, JQuery nicht zuzulassen, sind eingebettete Websites, z. B. ich verwende einen eingebetteten WiFi-Chip, der nur 250 KB für die gesamte Website hat. Es ist ein Druck mit all den Bildern, wie es ist.
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>

Bei jedem Durchlauf während der Schleife nimmt der R / C-Iterator zu und ein neues Zeilen- / Zellenobjekt aus der Sammlung wird Zeilen- / Zellenvariablen zugewiesen. Wenn sich keine Zeilen / Zellen mehr in der Sammlung befinden, wird false der Zeilen- / Zellenvariablen zugewiesen und durchlaufen, während die Schleife stoppt (beendet wird).

sbrbot
quelle
im vorherigen Beitrag: while (cell = row [r] .cells [c ++] sollte row.cells [c ++] sein, wobei row das aktuelle Objekt ist und ein Beispiel für den etw-Code: mycoldata = cell.innerHTML
fib Littul
12

Versuchen

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

Kamil Kiełczewski
quelle
2
sauber würde ich sagen
Shobi
3

Diese Lösung hat bei mir perfekt funktioniert

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.
quelle
Ist das überhaupt JavaScript? Weil deine for-Schleife etwas wie PHP aussieht.
Aravk33
2
Viele Sprachen sind überraschend ähnlich, wenn Sie wissen, wonach Sie suchen müssen. PHP würde vor jeder Variablen ein $ verwenden, dies ist jedoch nicht der Fall. var ist auch ein Schlüsselwort, das von JavaScript verwendet wird, nicht von PHP, obwohl ich es möglicherweise übersehen habe, wenn sie es hinzugefügt haben. - edit- gah no enter for newline ... Wie ich schon sagte: Logik ist universell. Zu wissen, wie man es in andere Sprachen überträgt, ist eine unglaublich nützliche Fähigkeit, die nicht schwer zu erlernen ist - wir sind intellektuelle Wesen mit hervorragenden Fähigkeiten zur Mustererkennung. Identifizieren Sie die Änderungen zwischen den einzelnen Sprachen oder verwenden Sie einfach die Lexer-Sprachdefinition ...
Acecool
3

Wenn Sie einen mit einem funktionalen Stil möchten, wie folgt:

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

Sie können das Prototypobjekt von HTMLCollection ändern (in ähnlicher Weise wie Erweiterungsmethoden in C # verwenden) und eine Funktion einbetten, die die Auflistung in ein Array konvertiert, sodass Funktionen höherer Ordnung mit dem oben genannten Stil (Art des Linq-Stils in) verwendet werden können C #):

    Object.defineProperty(HTMLCollection.prototype, "toArray", {
        value: function toArray() {
            return Array.prototype.slice.call(this, 0);
        },
        writable: true,
        configurable: true
    });
l30_4l3X
quelle
Nicht gefangener TypeError: Die Eigenschaft 'toArray' von undefined kann nicht gelesen werden -> Dies habe ich erhalten, als ich diese Lösung ausprobiert habe.
Vineela Thonupunuri
Seltsam. Ich habe es noch einmal versucht und es hat funktioniert. Ich konnte den Fehler, auf den Sie hingewiesen haben, jedoch nicht reproduzieren. Vielleicht ist das Problem der Browser. Ich habe mit Edge und IE getestet und beide haben nicht funktioniert. Chrome, Firefox und Safari funktionierten wie erwartet.
l30_4l3X
Ich habe auch Chrom verwendet.
Vineela Thonupunuri
Das funktioniert auch bei mir. Das muss Object.definePropertynatürlich vor dem Rest des Codes gehen, aber es funktioniert. @ Vineela Thonupunuri hast du es mit dem Code in der richtigen Reihenfolge versucht?
FlippingBinary
3

Bessere Lösung: Verwenden Sie das native Javascript Array.from()und konvertieren Sie das HTMLCollection-Objekt in ein Array. Anschließend können Sie Standard-Array-Funktionen verwenden.

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

Sie können auch auf tr.rowIndexund cell.colIndexanstelle von row_indund verweisen col_ind.

Ich viel lieber diesen Ansatz über die Top-2 Antworten höchsten gestimmt , weil es nicht mit globalen Variablen Code nicht Unordnung i, j, rowund col, und deshalb liefert es sauber, modular Code, der keine Nebenwirkungen haben (oder Erhöhung Flusen / Compiler - Warnungen) ... ohne andere Bibliotheken (zB jquery).

Wenn Sie dies benötigen, um in einer alten Version (vor ES2015) von Javascript ausgeführt zu werden, Array.fromkann dies mehrfach ausgefüllt werden.

mwag
quelle
1

Sie können .querySelectorAll()alle tdElemente auswählen und diese dann mit durchlaufen .forEach(). Ihre Werte können abgerufen werden mit .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>

Wenn Sie nur Spalten aus einer bestimmten Zeile auswählen möchten, können Sie mithilfe der :nth-child()Pseudoklasse eine bestimmte auswählen tr, optional in Verbindung mit dem untergeordneten Kombinator ( >) (was nützlich sein kann, wenn Sie eine Tabelle in einer Tabelle haben):

Obsidianzeitalter
quelle
1

Verwenden einer einzelnen for-Schleife:

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