如何反转(转置)HTML 表格的行和列?

IT技术 javascript html-table
2021-01-29 10:23:35

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

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

例子 :

1 4 7  
2 5 8  
3 6 9

作为

1 2 3  
4 5 6  
7 8 9  
6个回答

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(混合)会很棒。
2021-03-23 10:23:35
其实这不是直的js,而是jQuery
2021-03-26 10:23:35
我尝试编辑以添加对 th 的支持,但我的编辑被拒绝,说它应该采用新答案的形式,但我不能,因为问题已关闭......为什么再次关闭?我认为不应该。无论如何,它在这里。jsfiddle.net/CsgK9/770
2021-03-30 10:23:35
绝对破坏复杂的表(有colgroups、theads、rowspans等)
2021-04-08 10:23:35
谢谢你!
2021-04-08 10:23:35

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处理过载。
2021-03-15 10:23:35
在 jsfiddle 中,如果您将 a<br />放入一个单元格(即<td>James<br />Bond</td>,则它看起来是错误的Bushell 的解决方案也是如此。
2021-03-24 10:23:35
这是最好的解决方案。
2021-04-12 10:23:35

这应该适用于任意 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/

@Reb Cabin 我在这里的回答中添加了不规则的表格支持(tdth支持):stackoverflow.com/a/66308509/4582204
2021-03-14 10:23:35
几乎适用于参差不齐的表格(行长度不等的表格)。非常简单!
2021-03-17 10:23:35
还为我提供了 jsfiddle 的介绍,这是我不知道的。再次感谢!
2021-03-23 10:23:35

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

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

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

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

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

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

我正在寻找一种非 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/