Làm cách nào để lặp qua các hàng và ô trong JavaScript?


190

Nếu tôi có một bảng HTML ... hãy nói

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

Làm thế nào tôi lặp lại qua tất cả các hàng của bảng (giả sử số lượng hàng có thể thay đổi mỗi lần tôi kiểm tra) và truy xuất giá trị từ mỗi ô trong mỗi hàng từ trong JavaScript?

Câu trả lời:


301

Nếu bạn muốn đi qua từng hàng (<tr> ), biết / xác định hàng ( <tr>) và lặp qua từng cột ( <td>) của mỗi hàng ( <tr>), thì đây là cách để đi.

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

Nếu bạn chỉ muốn đi qua các ô ( <td>), bỏ qua hàng nào bạn đang đi, thì đây là cách để đi.

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 không tương thích với trình duyệt
EricG

7
@WilliamRemacle Tôi đã đăng câu trả lời này gần 4 năm trước .. IE 9 thậm chí không phải là một ý nghĩ vào thời điểm đó!
John Hartsock

@JohnHartsock Tôi biết nhưng tôi đã sử dụng giải pháp của bạn và nhận ra rằng nó không hoạt động trên IE. Nó chỉ là một bình luận để cảnh báo những người khác ... Dù sao tôi cũng đã bỏ phiếu cho câu trả lời của bạn ;-)
William Remacle 7/214

hàm itTable () {document.writeln ("itTable"); var bảng = document.getEuityById ("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"); } Tại sao mã này không cho phép tôi lặp qua một bảng tương tự như bảng trên.
Doug Hauf

Đối với những người (đến đây thông qua google) cần một shim đơn giản và nhỏ cho table.cells(để vá một số mã định hướng cũ hơn / IE), hãy xem câu trả lời của tôi cho Q: Trình duyệt Firefox không nhận ra bảng.cells?
GitaarLAB

65

Bạn có thể xem xét sử dụng jQuery. Với jQuery, nó cực dễ và có thể trông như thế này:

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

3
Không thể sử dụng jquery ... công ty không cho phép nó. Đừng hỏi tại sao.
GregH

21
Đó là một chính sách điên rồ. Bạn luôn có thể sao chép-n-dán các hàm có liên quan bạn cần từ jQuery vào mã ứng dụng của riêng bạn. Trừ khi có chính sách chống lại việc sử dụng mã của người khác trực tuyến, nhưng sau đó bạn sẽ không ở đây.
Clinton

13
@Judy: Không đồng ý với "chính sách điên rồ" .... có rất nhiều lý do để không sử dụng jQuery
Bigjim

JQuery là thứ mà tôi chưa từng sử dụng trong một thời gian và dường như chỉ nhìn thoáng qua một thứ gì đó phức tạp và không dễ để có được. Nhưng tôi nghĩ đó chỉ là vì tôi chưa sử dụng nó nhiều.
Doug Hauf

5
Một lý do khác để không cho phép JQuery là cho các trang web nhúng, ví dụ: Tôi đang sử dụng chip WiFi nhúng chỉ có 250Kb cho toàn bộ trang web. Đó là một ép với tất cả các hình ảnh như nó là.
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>

Trong mỗi lần đi qua vòng lặp r / c iterator tăng và đối tượng hàng / ô mới từ bộ sưu tập được gán cho các biến hàng / ô. Khi không còn hàng / ô trong bộ sưu tập, false được gán cho biến hàng / ô và lặp qua vòng lặp while (thoát).


trong bài trước: while (cell = row [r] .cells [c ++] nên là row.cells [c ++], hàng là đối tượng hiện tại và một ví dụ cho mã sth: mycoldata = cell.innerHTML
fib Littul

12

Thử

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


2
sạch sẽ tôi sẽ nói
Shobi

3

Giải pháp này làm việc hoàn hảo cho tôi

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

Đó có phải là JavaScript không? Bởi vì vòng lặp for của bạn trông hơi giống PHP.
aravk33

2
Rất nhiều ngôn ngữ giống nhau một cách đáng ngạc nhiên khi bạn biết phải tìm gì. PHP sẽ sử dụng $ ở phía trước mỗi biến, điều này không. var cũng là một từ khóa được sử dụng bởi JavaScript, không phải PHP mặc dù nếu họ thêm nó tôi có thể đã bỏ lỡ nó. - chỉnh sửa- gah no enter cho dòng mới ... Như tôi nói: Logic là phổ quát. Biết cách phiên âm nó sang các ngôn ngữ thay thế là một kỹ năng cực kỳ hữu ích, không khó học - chúng ta là những sinh vật có trí tuệ với khả năng khớp mẫu tuyệt vời. Xác định các thay đổi giữa mỗi ngôn ngữ hoặc chỉ cần sử dụng định nghĩa ngôn ngữ lexer ...
Acecool

3

Nếu bạn muốn một cái có kiểu dáng chức năng, như thế này:

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

Bạn có thể sửa đổi đối tượng nguyên mẫu của HTMLCollection (cho phép sử dụng theo cách tương tự với các phương thức mở rộng trong C #) và nhúng vào đó một hàm chuyển đổi bộ sưu tập thành mảng, cho phép sử dụng các hàm thứ tự cao hơn với kiểu trên (kiểu linq trong C #):

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

Uncaught TypeError: Không thể đọc thuộc tính 'toArray' của không xác định -> Đây là những gì tôi nhận được, khi tôi thử giải pháp này.
Vineela Thonupunuri

Lạ thật. Tôi đã thử lại và nó hoạt động. Tôi không thể tái tạo lỗi bạn chỉ, mặc dù. Có lẽ vấn đề là trình duyệt. Tôi đã thử nghiệm bằng Edge và IE và cả hai đều không hoạt động. Chrome, Firefox và Safari đã hoạt động như mong đợi.
l30_4l3X

Tôi đã sử dụng chrome quá.
Vineela Thonupunuri

Điều này làm việc cho tôi quá. Các Object.definePropertyrõ ràng là phải đi trước phần còn lại của mã này, nhưng nó hoạt động. @Vineela Thonupunuri bạn đã thử nó với mã theo đúng thứ tự chưa?
FlippingBinary

3

Giải pháp tốt hơn: sử dụng nguồn gốc của Javascript Array.from()và để chuyển đổi đối tượng HTMLCollection thành một mảng, sau đó bạn có thể sử dụng các hàm mảng tiêu chuẩn.

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

Bạn cũng có thể tham khảo tr.rowIndexcell.colIndexthay vì sử dụng row_indcol_ind.

Tôi rất thích phương pháp này trên đầu 2 cao nhất bình chọn câu trả lời vì nó không lộn xộn mã của bạn với các biến toàn cục i, j, rowcol, và do đó nó mang lại sạch, mã mô-đun đó sẽ không có bất kỳ tác dụng phụ (hoặc tăng lint / cảnh báo trình biên dịch) ... Không có các thư viện khác (ví dụ jquery).

Nếu bạn yêu cầu điều này để chạy trong một phiên bản cũ (trước ES2015) của Javascript, Array.fromcó thể được điền đầy đủ.


1

Bạn có thể sử dụng .querySelectorAll()để chọn tất cả các tdyếu tố, sau đó lặp lại những yếu tố này với .forEach(). Giá trị của chúng có thể được lấy bằng .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>

Nếu bạn muốn chỉ chọn các cột từ một hàng cụ thể, bạn có thể sử dụng lớp giả :nth-child()để chọn một cụ thể tr, tùy ý kết hợp với bộ kết hợp con ( >) (có thể hữu ích nếu bạn có một bảng trong bảng):


1

Sử dụng một vòng lặp duy nhất:

var table = document.getElementById('tableID');  
var count = table.rows.length;  
for(var i=0; i<count; i++) {    
    console.log(table.rows[i]);    
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.