ฉันจะวนซ้ำแถวตารางและเซลล์ใน 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>) โดยไม่สนใจแถวที่คุณอยู่นี่คือวิธีที่จะไป

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"); สำหรับ (var i = 0, แถว; row = table.rows [i]; i ++) {document.writeln (i); สำหรับ (var j = 0, col; col = row.cells [j]; j ++) {document.writeln (j); }} document.writeln ("end-itTable"); } ทำไมรหัสนี้จะไม่ให้ฉันวนซ้ำผ่านตารางคล้ายกับที่กล่าวมาข้างต้น
Doug Hauf

สำหรับผู้ที่ (มาที่นี่ผ่าน Google) ต้องการshim ที่ง่ายและเล็กสำหรับtable.cells(เพื่อแก้ไขโค้ดที่เก่ากว่า / IE-oriented) ดูคำตอบของฉันที่จะถาม: เบราว์เซอร์ 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
นั่นเป็นนโยบายที่บ้าคลั่ง คุณสามารถคัดลอก -n-paste ฟังก์ชั่นที่เกี่ยวข้องที่คุณต้องการจาก jQuery ไปยังรหัสแอปพลิเคชันของคุณเอง เว้นแต่จะมีนโยบายต่อต้านการใช้รหัสของผู้อื่นทางออนไลน์ แต่คุณจะไม่อยู่ที่นี่
Clinton

13
@Judy: ไม่เห็นด้วยกับ "นโยบายบ้า" .... มีเหตุผลมากมายที่ไม่ได้ใช้ jQuery
Bigjim

JQuery เป็นสิ่งที่ฉันไม่ได้ใช้ในขณะนี้และดูเหมือนจะเป็นสิ่งที่ซับซ้อนและไม่ง่ายที่จะเข้าไปข้างใน แต่ฉันคิดว่านั่นเป็นเพราะฉันไม่ได้ใช้มันมากนัก
Doug Hauf

5
อีกเหตุผลหนึ่งที่ไม่อนุญาตให้ JQuery สำหรับเว็บไซต์แบบฝังตัวเช่นฉันใช้ชิป WiFi แบบฝังซึ่งมีเพียง 250Kb สำหรับเว็บไซต์ทั้งหมด มันบีบด้วยภาพทั้งหมดตามที่เป็นอยู่
นิค

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>

ในแต่ละ pass through ในขณะที่วนรอบ r / c iterator เพิ่มขึ้นและวัตถุแถว / เซลล์ใหม่จากคอลเลกชันถูกกำหนดให้กับตัวแปรแถว / เซลล์ เมื่อไม่มีการรวบรวมแถว / เซลล์อีกต่อไปจะมีการกำหนดค่า false ให้กับตัวแปรแถว / เซลล์และการวนซ้ำตลอดขณะที่ลูปหยุด (ออก)


ในโพสต์ก่อนหน้านี้: ในขณะที่ (เซลล์ = แถว [r] .cells [c ++] ควรเป็น row.cells [c ++], แถวเป็นวัตถุปัจจุบันและตัวอย่างสำหรับรหัส sth: mycoldata = cell.innerHTML
อบ

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

นั่นคือแม้แต่จาวาสคริปต์? เพราะห่วง for ของคุณดูเหมือนว่า PHP
aravk33

2
มีหลายภาษาที่คล้ายกันอย่างน่าประหลาดใจเมื่อคุณรู้ว่าควรมองหาอะไร PHP จะใช้ $ หน้าตัวแปรแต่ละอัน var เป็นคำหลักที่ใช้โดย JavaScript ไม่ใช่ PHP แม้ว่าหากเพิ่มไว้ฉันอาจพลาดไปได้ - แก้ไข - gah ไม่เข้าสู่การขึ้นบรรทัดใหม่ ... อย่างที่ฉันบอกว่า: ลอจิกเป็นสากล การรู้วิธีที่จะถอดความมันเป็นภาษาอื่นเป็นทักษะที่มีประโยชน์อย่างไม่น่าเชื่อซึ่งไม่ยากที่จะเรียนรู้ - เราเป็นมนุษย์ที่มีสติปัญญาที่มีความสามารถในการจับคู่รูปแบบที่ยอดเยี่ยม ระบุการเปลี่ยนแปลงระหว่างแต่ละภาษาหรือใช้นิยามภาษา lexer ...
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 #) และฝังลงในฟังก์ชั่นที่แปลงคอลเลกชันเป็นอาร์เรย์ช่วยให้ใช้ funcions คำสั่งที่สูงขึ้นด้วยสไตล์ข้างต้น ค#):

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

Uncaught TypeError: ไม่สามารถอ่านคุณสมบัติ 'toArray' ของ undefined -> นี่คือสิ่งที่ฉันได้รับเมื่อฉันลองวิธีแก้ไขปัญหานี้
Vineela Thonupunuri

แปลก. ฉันลองอีกครั้งและใช้งานได้ ฉันไม่สามารถทำซ้ำข้อผิดพลาดที่คุณชี้ไปได้ บางทีปัญหาคือเบราว์เซอร์ ฉันทดสอบโดยใช้ Edge และ IE และทั้งสองใช้งานไม่ได้ Chrome, Firefox และ Safari ทำงานได้ตามที่คาดไว้
l30_4l3X

ฉันใช้โครเมียมด้วย
Vineela Thonupunuri

มันก็ใช้ได้กับฉันเช่นกัน Object.definePropertyเห็นได้ชัดว่ามีการไปก่อนส่วนที่เหลือของรหัส แต่การทำงาน @Vineela Thonupunuri คุณลองใช้โค้ดตามลำดับที่ถูกต้องหรือไม่?
FlippingBinary

3

วิธีแก้ปัญหาที่ดีกว่า: ใช้ native Javascript Array.from()และแปลง HTMLCollection object เป็น array หลังจากนั้นคุณสามารถใช้ฟังก์ชัน array มาตรฐานได้

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)

หากคุณต้องการให้สิ่งนี้ทำงานใน Javascript เวอร์ชันเก่า (pre-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เลือกร่วมกับCombinator เด็ก ( >) (ซึ่งจะเป็นประโยชน์ถ้าคุณมีตารางที่อยู่ในตาราง):


1

ใช้สำหรับวงเดียว:

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.