JavaScript에서 테이블 행과 셀을 어떻게 반복합니까?


192

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 내에서 각 행의 각 셀에서 값을 검색하는 방법은 무엇입니까?

답변:


304

각 행 ( <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>어떤 행을 무시하고 cells ( ) 을 살펴보고 싶다면 이 방법입니다.

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

8
@WilliamRemacle이 답변은 거의 4 년 전에 게시되었습니다. IE 9는 당시에는 생각조차하지 않았습니다!
John Hartsock

@ JohnHartsock 알고 있지만 솔루션을 사용하여 IE에서 작동하지 않는 것으로 나타났습니다. 그것은 다른 사람들에게 경고하는 의견 일뿐입니다 ... 어쨌든 귀하의 답변에 투표했습니다. ;-)
William 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

구식 / IE 지향 코드를 패치하기 위해 단순하고 작은 심이 필요한 사람들 (구글을 통해 여기에 오는 경우 table.cells)에 대한 내 대답 을 참조하십시오 : Firefox 브라우저가 table.cells를 인식하지 못합니까?
GitaarLAB

67

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

21
그것은 미친 정책입니다. jQuery에서 자신의 애플리케이션 코드로 필요한 관련 기능을 항상 복사하여 붙여 넣을 수 있습니다. 온라인으로 다른 사람의 코드를 사용하는 것에 대한 정책이 없다면 여기에 없을 것입니다.
클린턴

13
@ Judy : "미친 정책"에 동의하지 않습니다 .... jQuery를 사용하지 않는 데는 많은 이유가 있습니다
Bigjim

JQuery는 한동안 사용하지 않았고 한 눈에 복잡하고 둘러보기가 쉽지 않은 것 같습니다. 그러나 나는 그것을 많이 사용하지 않았기 때문이라고 생각합니다.
Doug Hauf

5
JQuery를 허용하지 않는 또 다른 이유는 임베디드 웹 사이트에 대한 것입니다. 예를 들어 전체 웹 사이트에 250Kb의 임베디드 WiFi 칩을 사용하고 있습니다. 모든 이미지가 그대로 짜여져 있습니다.
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>

각 패스 스루 동안 루프 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

2
무엇을 찾아야할지 많은 언어가 놀라 울 정도로 비슷합니다. PHP는 각 변수 앞에 $를 사용하지만 그렇지 않습니다. var는 PHP가 아닌 JavaScript에서 사용되는 키워드이지만 추가하면 놓칠 수 있습니다. -edit- gah는 개행을 입력하지 않습니다 ... 내가 말한 것처럼 : 논리는 보편적입니다. 그것을 다른 언어로 번역하는 방법을 아는 것은 배우기가 어렵지 않은 매우 유용한 기술입니다. 우리는 뛰어난 패턴 일치 능력을 가진 지성입니다. 각 언어 사이의 변화를 식별하거나 간단히 어휘 분석 언어 정의를 사용하십시오.
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 #의 확장 메서드와 유사한 방식으로 사용 가능) 컬렉션을 배열로 변환하는 함수에 포함하여 위 스타일 (in linq 스타일의 종류)에서 고차 함수를 사용할 수 있습니다. 씨#):

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

잡히지 않은 TypeError : 정의되지 않은 'toArray'속성을 읽을 수 없습니다->이 솔루션을 시도했을 때 얻은 것입니다.
Vineela Thonupunuri

이상한. 나는 그것을 다시 시도했고 효과가 있었다. 그래도 당신이 지적한 오류를 재현 할 수 없었습니다. 브라우저에 문제가있을 수 있습니다. Edge와 IE를 사용하여 테스트했지만 둘 다 작동하지 않았습니다. Chrome, Firefox 및 Safari가 예상대로 작동했습니다.
l30_4l3X 2009 년

나는 크롬도 사용했다.
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.rowIndexcell.colIndex대신 사용 row_ind하고 col_ind.

나는 많이 전역 변수와 코드를 복잡하게하지 않기 때문에 (2)는 답변을 가장 높은 투표 맨 위에이 방법을 선호 i, j, rowcol, 따라서 그것은 깨끗하고 모듈 부작용이 없습니다 코드 제공 (또는 인상 보풀 / 컴파일러 경고) ... 다른 라이브러리가없는 경우 (예 : jquery)

이전 버전 (ES2015 이전)의 자바 스크립트에서 실행 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.