回答:
各行(<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
}
jQueryの使用を検討できます。jQueryを使用すると、非常に簡単で、次のようになります。
$('#mytab1 tr').each(function(){
$(this).find('td').each(function(){
//do your stuff, you can use $(this) to get current cell
})
})
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ループが停止(終了)します。
試す
for (let row of mytab1.rows)
{
for(let cell of row.cells)
{
let val = cell.innerText; // your code below
}
}
このソリューションは私にとって完璧に機能しました
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 = "";
}
}
次のような機能的なスタイルが必要な場合:
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
});
Object.defineProperty明らかに、コードの残りの部分の前に行かなければならないが、それは動作します。@Vineela Thonupunuriコードを正しい順序で試しましたか?
より良い解決策: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_indとcol_ind。
これはグローバル変数を使用して、コードを乱雑にしないので、私はずっとトップ2最高投票の回答に対するこのアプローチを好むi、j、rowそしてcol、そのためには、任意の副作用(またはレイズ糸くず/コンパイラの警告を)持っていないきれいな、モジュラーコードを提供します...他のライブラリ(jqueryなど)なし。
これを古いバージョン(ES2015より前)のJavascriptで実行する必要がある場合は、ポリフィルArray.fromすることができます。
を使用.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。オプションで、子コンビネーター(>)と組み合わせて使用できます(テーブル内にテーブルがある場合に役立ちます)。