【问题标题】:How to invert (transpose) the rows and columns of an HTML table?如何反转(转置)HTML 表格的行和列?
【发布时间】:2011-09-11 23:02:02
【问题描述】:

我想转置 HTML 表格中的行和列,即行作为列,列作为行。

我可以通过什么方式做到这一点?

例子:

1 4 7  
2 5 8  
3 6 9

作为

1 2 3  
4 5 6  
7 8 9  

【问题讨论】:

  • 至少将一些 HTML 粘贴到 jsfiddle.net 中,以便我可以实时使用代码。我很感兴趣,直到我意识到数据设置会有多无聊。 :P
  • 只有 css 的解决方案可以在这里找到:stackoverflow.com/questions/16918094#16919439

标签: javascript html-table


【解决方案1】:

http://jsfiddle.net/CsgK9/2/

html:

<table>
    <tr>
        <td>1</td>
        <td>4</td>
        <td>7</td>
    </tr>
    <tr>
        <td>2</td>
        <td>5</td>
        <td>8</td>
    </tr>
    <tr>
        <td>3</td>
        <td>6</td>
        <td>9</td>
    </tr>
</table>


<p><a href="#">Do it.</a></p>

js:

$("a").click(function(){
    $("table").each(function() {
        var $this = $(this);
        var newrows = [];
        $this.find("tr").each(function(){
            var i = 0;
            $(this).find("td").each(function(){
                i++;
                if(newrows[i] === undefined) { newrows[i] = $("<tr></tr>"); }
                newrows[i].append($(this));
            });
        });
        $this.find("tr").remove();
        $.each(newrows, function(){
            $this.append(this);
        });
    });

    return false;
});

【讨论】:

  • 支持tdth(混合)会很棒。
  • 我尝试编辑以添加对 th 的支持,但我的编辑被拒绝,说它应该是新答案的形式,但我不能,因为问题已关闭...为什么又是关闭??我认为不应该。无论如何,它是。 jsfiddle.net/CsgK9/770
  • 绝对销毁复杂表(colgroups、theads、rowspans 等)
  • 谢谢!
  • 其实这不是直的js,而是jQuery
【解决方案2】:

David Bushell 有一个 CSS 解决方案(使用 flexbox): http://dbushell.com/2016/03/04/css-only-responsive-tables/

还有这个 CSS 解决方案(使用浮动)

tr { display: block; float: left; }
th, td { display: block; }

http://jsfiddle.net/XKnKL/3/

(在这个答案中都提到了它们:HTML Table with vertical rows

【讨论】:

  • 我真的非常推荐css解决方案。它不会增加一些大页面中巨大的js处理过载。
  • 在 jsfiddle 中,如果您将 &lt;br /&gt; 放在一个单元格中(即 &lt;td&gt;James&lt;br /&gt;Bond&lt;/td&gt;),它看起来是错误的。 Bushell 的解决方案也是如此。
  • 这是最好的解决方案。
【解决方案3】:

这应该适用于任意 html:

function swap( cells, x, y ){
   if( x != y ){     
   var $cell1 = cells[y][x];
   var $cell2 = cells[x][y];
   $cell1.replaceWith( $cell2.clone() );
   $cell2.replaceWith( $cell1.clone() );
    }
}

var cells = [];
$('table').find('tr').each(function(){
    var row = [];
    $(this).find('td').each(function(){
       row.push( $(this) );    
    });
    cells.push( row );
});

for( var y = 0; y <= cells.length/2; y++ ){
    for( var x = 0; x < cells[y].length; x++ ){
        swap( cells, x, y );
    }   
}

工作小提琴:

http://jsfiddle.net/Hskke/1/

【讨论】:

  • 还作为我不知道的 jsfiddle 的介绍。再次感谢!
  • 几乎适用于参差不齐的表格(那些行长不等的表格)。非常简单!
  • @Reb Cabin 我在这里的回答中添加了不规则表支持(以及tdth 支持):stackoverflow.com/a/66308509/4582204
【解决方案4】:

你想用什么语言来做?我假设 JavaScript,正如你所说的 jQuery。 (jQuery 不是一种语言,它是一种语言的库)

您需要找到一种将表表示为数据结构的方法。为简单起见,这应该通过 OOP 完成。我建议您获取列数和行数并将数据放入 1 个单一的平面数组中。

您还需要设计一些东西来解析 HTML 并获取表格,将其转换为您的结构,从而轻松完成计算。这可以通过 jQuery 的方法来完成。

那么你需要找到一个排序函数来对平面数组进行排序。

最后,您需要将数组分解为适当的列和行并重新呈现 HTML。

看!没那么难。设计已经为您完成了,您所需要的只是实现它。 (也许我不应该为你做这么多的工作......)

【讨论】:

    【解决方案5】:

    我一直在寻找一种非 jquery 的方法并想出了这个:

    const transposeTable = (tbody, newContainerType = "tbody") => {
      const rows = Array.from(tbody.querySelectorAll("tr"))
      const newTbody = document.createElement(newContainerType)
    
      for (let rowIdx = 0; rowIdx < rows.length; rowIdx++) {
        const row = rows[rowIdx]
        const cells = Array.from(row.querySelectorAll("td, th"))
    
        for (let cellIdx = 0; cellIdx < cells.length; cellIdx++ ) {
          const cell = cells[cellIdx]
          const newRow = newTbody.children[cellIdx] || document.createElement("tr")
          if (!newTbody.children[cellIdx]) {
            newTbody.appendChild(newRow)
          }
          newRow.appendChild(cell.cloneNode(true))
        }
      }
      
      // Do live DOM manipulations only once for performance
      tbody.parentElement.appendChild(newTbody)
      tbody.parentElement.removeChild(tbody)
    }
    
    transposeTable(document.querySelector("tbody"))
    

    参考:https://jsfiddle.net/ThomasR/0b9pv1rx/43/

    【讨论】:

      【解决方案6】:

      这是@svinto 的答案,添加了

      • 支持tdth(混合)
      • 参差不齐的表格(行(和列)长度不等的表格)

      http://jsfiddle.net/xsp4eqwz/2/

      $("a#transposeButton").click(function(){
          $("table#transposeThis").each(function() {
              var $this = $(this);
              var newrows = [];
              $this.find("tr").each(function(rowToColIndex){
                  $(this).find("td, th").each(function(colToRowIndex){
                      if(newrows[colToRowIndex] === undefined) { newrows[colToRowIndex] = $("<tr></tr>"); }
                      while(newrows[colToRowIndex].find("td, th").length < rowToColIndex){
                          newrows[colToRowIndex].append($("<td></td>"));
                      }
                      newrows[colToRowIndex].append($(this));
                  });
              });
              $this.find("tr").remove();
              $.each(newrows, function(){
                  $this.append(this);
              });
          });
          
          return false;
      });
      td, th { padding:5px; border:1px solid #ccc;}
      
      th { background-color: silver; font-weight: bold }
      <table id="transposeThis">
          <tr>
              <th>H1</th>
              <th>H2</th>
              <th>H3</th>
          </tr>
          <tr>
              <td>1</td>
              <td>4</td>
          </tr>
          <tr>
              <td>2</td>
              <td>5</td>
              <td>8</td>
          </tr>
          <tr>
              <th>H1</th>
              <th>H2</th>
              <th>H3</th>
              <th>H4</th>
          </tr>
          <tr>
              <td>3</td>
              <td>6</td>
              <td>9</td>
              <td>10</td>
          </tr>
      </table>
      
      
      <p><a href="#" id="transposeButton">Do it.</a></p>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-23
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 2019-11-20
        • 2022-01-21
        • 1970-01-01
        相关资源
        最近更新 更多