Bagaimana cara saya mengulangi baris dan sel tabel dalam JavaScript?

192

Jika saya memiliki tabel HTML ... katakanlah

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

Bagaimana saya mengulangi semua baris tabel (dengan asumsi jumlah baris bisa berubah setiap kali saya periksa) dan mengambil nilai dari setiap sel di setiap baris dari dalam JavaScript?

Greg
sumber

Jawaban:

304

Jika Anda ingin melewati setiap baris ( <tr>), mengetahui / mengidentifikasi baris ( <tr>), dan beralih melalui setiap kolom ( <td>) dari setiap baris ( <tr>), maka ini adalah cara untuk pergi.

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

Jika Anda hanya ingin menelusuri sel ( <td>), mengabaikan baris mana yang Anda gunakan , maka inilah cara yang harus ditempuh.

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
sumber
3
ex2, table.cells tidak kompatibel dengan browser
EricG
8
@ WilliamRemacle Saya memposting jawaban ini hampir 4 tahun yang lalu .. IE 9 bahkan tidak terpikirkan saat itu!
John Hartsock
@ JohnHartsock Saya tahu tetapi saya menggunakan solusi Anda dan menemukan bahwa itu tidak berfungsi pada IE. Itu hanya komentar untuk memperingatkan yang lain ... Saya tetap memilih jawaban Anda ;-)
William Remacle
function itTable () {document.writeln ("itTable"); var table = document.getElementById ("mytab"); untuk (var i = 0, baris; baris = table.rows [i]; i ++) {document.writeln (i); untuk (var j = 0, col; col = row.cells [j]; j ++) {document.writeln (j); }} document.writeln ("end-itTable"); } Mengapa kode ini tidak membiarkan saya mengulang tabel yang mirip dengan yang di atas.
Doug Hauf
Bagi mereka (datang ke sini melalui google) yang membutuhkan shim sederhana dan kecil untuk table.cells(untuk menambal beberapa kode yang lebih tua / berorientasi IE), lihat jawaban saya untuk T: Apakah browser Firefox tidak mengenali table.cell?
GitaarLAB
67

Anda dapat mempertimbangkan menggunakan jQuery. Dengan jQuery itu sangat mudah dan mungkin terlihat seperti ini:

$('#mytab1 tr').each(function(){
    $(this).find('td').each(function(){
        //do your stuff, you can use $(this) to get current cell
    })
})
dzida
sumber
3
Tidak dapat menggunakan jquery ... perusahaan tidak mengizinkannya. Jangan tanya kenapa.
GregH
21
Itu kebijakan gila. Anda selalu dapat hanya menyalin-n-tempel fungsi relevan yang Anda butuhkan dari jQuery ke kode aplikasi Anda sendiri. Kecuali ada kebijakan yang melarang penggunaan kode orang lain secara daring, tetapi Anda tidak akan berada di sini.
Clinton
13
@ Judy: Tidak setuju pada "kebijakan gila" .... ada banyak alasan untuk tidak menggunakan jQuery
Bigjim
JQuery adalah sesuatu yang belum pernah saya gunakan dalam sekejap dan sepertinya hanya sekilas sesuatu yang kompleks dan tidak mudah untuk dihubungi. Tetapi saya pikir itu hanya karena saya belum sering menggunakannya.
Doug Hauf
5
Alasan lain untuk melarang JQuery adalah untuk situs web yang disematkan misalnya saya menggunakan chip WiFi tertanam yang hanya memiliki 250Kb untuk seluruh situs web. Ini adalah tekanan dengan semua gambar seperti itu.
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>

Dalam setiap melewati sementara loop r / c iterator meningkat dan objek baris / sel baru dari koleksi ditugaskan ke variabel baris / sel. Ketika tidak ada lagi baris / sel dalam koleksi, false ditugaskan untuk variabel baris / sel dan iterasi melalui sementara loop berhenti (keluar).

sbrbot
sumber
dalam posting sebelumnya: while (cell = row [r] .cells [c ++] harus row.cells [c ++], baris menjadi objek saat ini, dan contoh untuk kode sth: mycoldata = cell.innerHTML
fib Littul
12

Mencoba

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

Kamil Kiełczewski
sumber
2
bersih saya akan mengatakan
Shobi
3

Solusi ini bekerja dengan sempurna untuk saya

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.
sumber
Apakah itu JavaScript? Karena for for loop Anda terlihat seperti PHP.
aravk33
2
Banyak bahasa secara mengejutkan serupa ketika Anda tahu apa yang harus dicari. PHP akan menggunakan $ di depan setiap variabel, ini tidak. var juga merupakan kata kunci yang digunakan oleh JavaScript, bukan PHP meskipun jika mereka menambahkannya, saya mungkin melewatkannya. - edit- gah no enter untuk baris baru ... Seperti yang saya katakan: Logika bersifat universal. Mengetahui cara menerjemahkannya ke bahasa alternatif adalah keterampilan yang sangat berguna yang tidak sulit untuk dipelajari - kita adalah makhluk berakal dengan kemampuan pencocokan pola yang sangat baik. Identifikasi perubahan antara setiap bahasa atau cukup gunakan definisi bahasa lexer ...
Acecool
3

Jika Anda menginginkannya dengan gaya fungsional, seperti ini:

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

Anda dapat memodifikasi objek prototipe HTMLCollection (memungkinkan untuk digunakan dengan cara yang menyerupai metode ekstensi dalam C #) dan menanamkan ke dalamnya fungsi yang mengubah koleksi menjadi array, memungkinkan untuk menggunakan fungsi urutan yang lebih tinggi dengan gaya di atas (jenis gaya linq di C #):

    Object.defineProperty(HTMLCollection.prototype, "toArray", {
        value: function toArray() {
            return Array.prototype.slice.call(this, 0);
        },
        writable: true,
        configurable: true
    });
l30_4l3X
sumber
UnEught TypeError: Tidak dapat membaca properti 'toArray' dari undefined -> Inilah yang saya dapatkan, ketika saya mencoba solusi ini.
Vineela Thonupunuri
Aneh. Saya mencobanya lagi dan berhasil. Saya tidak bisa mereproduksi kesalahan yang Anda tunjuk. Mungkin masalahnya adalah browser. Saya diuji menggunakan Edge dan IE dan keduanya tidak berhasil. Chrome, Firefox, dan Safari berfungsi seperti yang diharapkan.
l30_4l3X
Saya menggunakan chrome juga.
Vineela Thonupunuri
Ini juga berfungsi untuk saya. The Object.definePropertyjelas harus pergi sebelum sisa kode, tetapi bekerja. @Vineela Thonupunuri apakah Anda mencobanya dengan kode dalam urutan yang benar?
FlippingBinary
3

Solusi yang lebih baik: gunakan asli Javascript Array.from()dan untuk mengkonversi objek HTMLCollection ke array, setelah itu Anda dapat menggunakan fungsi array standar.

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

Anda juga bisa referensi tr.rowIndexdan cell.colIndexbukannya menggunakan row_inddan col_ind.

Saya lebih memilih pendekatan ini dari atas 2 tertinggi sebagai jawaban karena tidak kekacauan kode Anda dengan variabel global i, j, rowdan col, dan oleh karena itu memberikan bersih kode, modular yang tidak akan memiliki efek samping (atau kenaikan serat / peringatan compiler) ... tanpa perpustakaan lain (mis. jquery).

Jika Anda memerlukan ini untuk dijalankan dalam Javascript versi lama (pra-ES2015), Array.fromdapat diisi polif.

mwag
sumber
1

Anda dapat menggunakan .querySelectorAll()untuk memilih semua tdelemen, lalu mengulanginya dengan .forEach(). Nilai-nilainya dapat diambil dengan .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>

Jika Anda hanya ingin memilih kolom dari baris tertentu, Anda dapat menggunakan pseudo-class :nth-child()untuk memilih yang spesifik tr, secara opsional bersamaan dengan child combinator ( >) (yang dapat berguna jika Anda memiliki tabel di dalam tabel):

Zaman Obsidian
sumber
1

Menggunakan satu untuk loop:

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