JavaScript'teki tablo satırları ve hücreleri arasında nasıl yineleme yapabilirim?


192

Bir HTML tablom varsa ...

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

Tüm tablo satırları arasında nasıl yineleyebilirim (her kontrol ettiğimde satır sayısının değişebileceğini varsayarak) ve JavaScript içinden her satırdaki her bir hücrenin değerlerini nasıl alabilirim?

Yanıtlar:


304

Her satırı ( <tr>) bilmek, satırı ( ) bilmek / tanımlamak ve her satırın ( ) <tr>her sütununu ( <td>) yinelemek <tr>istiyorsanız, işte bu yol.

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

<td>Hangi satırda olduğunuzu görmezden gelerek sadece hücrelerden ( ) geçmek istiyorsanız , işte bu yol.

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 tarayıcı uyumlu değil
EricG

8
@WilliamRemacle Bu yanıtı neredeyse 4 yıl önce yayınladım .. IE 9 o zaman bile bir düşünce değildi!
John Hartsock

@JohnHartsock Biliyorum ama çözümünüzü kullandım ve IE üzerinde çalışmadığını anladım. Bu sadece diğerlerini uyarmak için bir yorum ... Yine de cevabınızı oyladım ;-)
William Remacle

function itTable () {document.writeln ("itTable"); var table = document.getElementById ("mytab"); for (var i = 0, satır; satır = tablo.rows [i]; i ++) {document.writeln (i); için (var j = 0, col; col = row.cells [j]; j ++) {document.writeln (j); }} document.writeln ("end-itTable"); } Bu kod neden yukarıdaki tabloya benzer bir tabloya girmeme izin vermiyor?
Doug Hauf

Bir ihtiyacı (google yöntemiyle buraya geliyor) olanlar için basit ve küçük için şim table.cells(bazı eski / IE yönelimli kod yama), bkz benim cevap için Q: mu Firefox tarayıcı table.cells tanımıyor?
GitaarLAB

67

JQuery kullanmayı düşünebilirsiniz. JQuery ile çok kolay ve şöyle görünebilir:

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

3
Jquery kullanılamıyor ... şirket buna izin vermiyor. Neden diye sorma.
GregH

21
Bu çılgın bir politika. JQuery'den istediğiniz işlevleri her zaman kendi uygulama kodunuza kopyalayıp yapıştırabilirsiniz. Başkalarının kodlarını çevrimiçi kullanmaya karşı bir politika olmadığı sürece, o zaman burada olmazsınız.
Clinton

13
@Judy: "Çılgın politika" üzerine katılmıyorum .... jQuery kullanmamanın birçok nedeni var
Bigjim

JQuery, bir süredir kullanmadığım bir şey ve sadece bir bakışta karmaşık ve etrafta dolaşmak kolay olmayan bir şey gibi görünüyor. Ama bence bu çok fazla kullanmadım.
Doug Hauf

5
JQuery'ye izin vermemenin bir başka nedeni, gömülü web siteleri içindir. Tüm görüntülerle olduğu gibi sıkın.
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>

Her geçişte döngü r / c yineleyicisi artar ve koleksiyondaki yeni satır / hücre nesnesi satır / hücre değişkenlerine atanır. Koleksiyonda başka satır / hücre olmadığında, satır / hücre değişkenine false değeri atanır ve döngü dururken (çıkışlarda) yineleme yapılır.


önceki gönderide: (cell = row [r] .cells [c ++] row.cells [c ++], satır geçerli nesne olmalı ve sth kodu için bir örnek olmalıdır: mycoldata = cell.innerHTML
fib Littul

12

Deneyin

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


2
temiz söyleyebilirim
Shobi

3

Bu çözüm benim için mükemmel çalıştı

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

JavaScript bile mi? Çünkü for döngüsü PHP'ye biraz benziyor.
aravk33

2
Ne arayacağınızı bildiğinizde birçok dil şaşırtıcı derecede benzerdir. PHP her değişkenin önünde bir $ kullanır, bunu kullanmaz. var da JavaScript eklenti, PHP değil kullanılan bir anahtar kelime olsa onlar eklediyse ben kaçırmış olabilir. - edit- gah newline için enter yok ... Dediğim gibi: Mantık evrenseldir. Alternatif dillere nasıl yazılacağını bilmek, öğrenmesi zor olmayan inanılmaz derecede faydalı bir beceridir - mükemmel desen eşleştirme yeteneklerine sahip akıl varlıklarıyız. Her dil arasındaki değişiklikleri belirleyin veya sadece lexer dil tanımını kullanın ...
Acecool

3

İşlevsel bir stile sahip olmak istiyorsanız, şöyle:

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

HTMLCollection'ın prototip nesnesini değiştirebilir (C # 'daki uzantı yöntemlerine benzeyen bir şekilde kullanılmasına izin verir) ve koleksiyona diziye dönüştürerek, yukarıdaki stille daha yüksek sıralı işlevler (linq stili C #):

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

Uncaught TypeError: undefined 'toArray' özelliği okunamıyor -> Bu çözümü denediğimde aldım.
Vineela Thonupunuri

Garip. Tekrar denedim ve işe yaradı. Yine de, işaret ettiğin hatayı tekrarlayamadım. Belki sorun tarayıcıdır. Edge ve IE kullanarak test ettim ve ikisi de işe yaramadı. Chrome, Firefox ve Safari beklendiği gibi çalıştı.
l30_4l3X

Ben de krom kullandım.
Vineela Thonupunuri

Bu benim için de geçerli. Object.definePropertyAçıkçası kodunun geri kalanı önce gitmek zorunda, ama işe yarıyor. @Vineela Thonupunuri kodu doğru sırayla denediniz mi?
FlippingBinary

3

Daha iyi bir çözüm: Javascript'in doğal özelliğini kullanın Array.from()ve HTMLCollection nesnesini bir diziye dönüştürün, ardından standart dizi işlevlerini kullanabilirsiniz.

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

Ayrıca referans olabilir tr.rowIndexve cell.colIndexkullanmak yerine row_indve col_ind.

Ben çok küresel değişkenlerle kodunuzu kalabalık etmez çünkü 2 cevaplar En yüksek oyu üstünden bu yaklaşım tercih i, j, rowve col, ve bu nedenle temiz, modüler herhangi bir yan etkisi olmaz kodunu verir (veya zam tiftiği / derleyici uyarılar) ... başka kütüphaneler olmadan (örn. jquery).

Bunun Javascript'in eski bir sürümünde (ES2015 öncesi) çalıştırılmasını istiyorsanız, çoklu doldurulabilir Array.from.


1

.querySelectorAll()Tüm tdöğeleri seçmek için düğmelerini kullanın ve ardından bunların üzerinde döngü yapın .forEach(). Değerleri şununla alınabilir .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>

Yalnızca belirli bir satırdaki sütunları seçmek istiyorsanız , isteğe bağlı olarak alt birleştirici ( ) ile birlikte ( tablo içinde bir tablonuz varsa yararlı olabilir ):nth-child() belirli bir sınıf seçmek için sözde sınıftan yararlanabilirsiniz :tr>


1

Tek bir döngü kullanma:

var table = document.getElementById('tableID');  
var count = table.rows.length;  
for(var i=0; i<count; i++) {    
    console.log(table.rows[i]);    
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.