JavaScriptでテーブルの行とセルを反復するにはどうすればよいですか?


190

HTMLテーブルがある場合...

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

すべてのテーブル行を反復処理し(チェックするたびに行数が変化すると想定)、JavaScript内から各行の各セルから値を取得するにはどうすればよいですか?

回答:


301

各行(<tr>)を通過し、行()を認識/識別し、各行(<tr>)の各列(<td>)を反復処理する<tr>場合、これが方法です。

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>)だけを調べたい場合は、現在の行を無視して、これが方法です。

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はブラウザ互換ではありません
EricG

7
@WilliamRemacle私がこの回答を投稿したのはほぼ4年前のことです。IE9は当時は考えさえしていませんでした。
John Hartsock、2014

@JohnHartsock知っていますが、私はあなたのソリューションを使用し、それがIEで機能しないことを理解しました。...私はとにかくあなたの答えを投票;-)他の人に警告するだけのコメントです
ウィリアムRemacle

関数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"); なぜこのコードでは、上記のようなテーブルをループできないのでしょうか。
Doug Hauf 2014

いくつかの古い/ IE指向のコードにパッチを適用するためにシンプルで小さなシムが必要(Googleからここに来るtable.cells)場合はQ
GitaarLAB 2014年

65

jQueryの使用を検討できます。jQueryを使用すると、非常に簡単で、次のようになります。

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

3
jqueryを使用できません...会社が許可していません。理由は聞かないでください。
GregH 2010年

21
それはクレイジーなポリシーです。必要な関連関数をjQueryから独自のアプリケーションコードに常にコピーして貼り付けることができます。他の人のコードをオンラインで使用することに対するポリシーがない限り、あなたはここにいません。
クリントン

13
@Judy:「クレイジーなポリシー」に同意しない.... jQueryを使用しない理由はたくさんあります
Bigjim

JQueryは、私がしばらく使用していなかったものであり、一見しただけでは複雑で使いにくいものです。しかし、それは私がそれをあまり使用していないためだと思います。
Doug Hauf 14年

5
JQueryを許可しないもう1つの理由は、埋め込みWebサイトのためです。たとえば、Webサイト全体で250 KBしかない埋め込みWiFiチップを使用しています。それは、すべての画像がそのままのスクイーズです。
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>

各パススルーのwhileループr / cイテレーターが増加し、コレクションからの新しい行/セルオブジェクトが行/セル変数に割り当てられます。コレクションに行/セルがなくなると、行/セル変数にfalseが割り当てられ、whileループが停止(終了)します。


前の投稿:while(cell = row [r] .cells [c ++]はrow.cells [c ++]でなければならず、rowは現在のオブジェクトであり、sthコードの例:mycoldata = cell.innerHTML
fib Littul

12

試す

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


2
クリーン私は言うでしょう
Shobi

3

このソリューションは私にとって完璧に機能しました

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ですか?forループがPHPのように見えるからです。
aravk33 2017

2
何を探すべきかわかっていると、多くの言語は驚くほど似ています。PHPは各変数の前に$を使用しますが、これは使用しません。varは、PHPではなくJavaScriptで使用されるキーワードでもありますが、追加した場合は、見落としている可能性があります。-編集-改行を入力しないでください...私が言うように:ロジックは普遍的です。それを別の言語に転記する方法を知ることは、学ぶことは難しくない信じられないほど有用なスキルです-私たちは優れたパターンマッチング能力を持つ知性の存在です。各言語間の変更を特定するか、単にレクサー言語定義を使用します...
Acecool

3

次のような機能的なスタイルが必要な場合:

    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のプロトタイプオブジェクトを変更し(C#の拡張メソッドに似た方法で使用できるようにします)、コレクションを配列に変換する関数を埋め込んで、上記のスタイル(のlinqスタイルの種類) C#):

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

Uncaught TypeError:undefinedのプロパティ 'toArray'を読み取れません->これは、このソリューションを試したときに取得したものです。
Vineela Thonupunuri

奇妙な。私はもう一度試してみましたが、うまくいきました。ただし、指摘されたエラーを再現できませんでした。多分問題はブラウザです。EdgeとIEを使用してテストしましたが、どちらも機能しませんでした。Chrome、Firefox、Safariは期待どおりに機能しました。
l30_4l3X

私もクロームを使いました。
Vineela Thonupunuri、

これも私にとってはうまくいきます。Object.defineProperty明らかに、コードの残りの部分の前に行かなければならないが、それは動作します。@Vineela Thonupunuriコードを正しい順序で試しましたか?
FlippingBinary

3

より良い解決策:JavaScriptのネイティブArray.from()を使用し、HTMLCollectionオブジェクトを配列に変換します。その後、標準の配列関数を使用できます。

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

また、参照することができtr.rowIndexそしてcell.colIndex代わりに使用したのrow_indcol_ind

これはグローバル変数を使用して、コードを乱雑にしないので、私はずっとトップ2最高投票の回答に対するこのアプローチを好むijrowそしてcol、そのためには、任意の副作用(またはレイズ糸くず/コンパイラの警告を)持っていないきれいな、モジュラーコードを提供します...他のライブラリ(jqueryなど)なし。

これを古いバージョン(ES2015より前)のJavascriptで実行する必要がある場合は、ポリフィルArray.fromすることができます。


1

を使用.querySelectorAll()してすべてのtd要素を選択し、でこれらをループできます.forEach()。それらの値は次のようにして取得できます.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>

特定の行から列のみを選択したい場合は、疑似クラス:nth-child()を使用して特定のを選択できますtr。オプションで、子コンビネーター(>)と組み合わせて使用できます(テーブル内にテーブルがある場合に役立ちます)。


1

単一のforループを使用する:

var table = document.getElementById('tableID');  
var count = table.rows.length;  
for(var i=0; i<count; i++) {    
    console.log(table.rows[i]);    
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.