Javascript 使用jquery对表中的行进行分组

Javascript 使用jquery对表中的行进行分组,javascript,jquery,asp.net,html,Javascript,Jquery,Asp.net,Html,我已经在前端创建了一个包含多个列的表。包含数据的表如下所示: ID Name Date1 Date2 Code1 00001 abc 2012/1/1 2012/1/10 1 00002 def 2012/1/12 2012/2/1 1 00002 def

我已经在前端创建了一个包含多个列的表。包含数据的表如下所示:

    ID         Name          Date1           Date2         Code1    
   00001        abc         2012/1/1         2012/1/10       1
   00002        def         2012/1/12        2012/2/1        1
   00002        def         2012/1/12        2012/2/1        2
   00002        def         2012/1/12        2012/2/1        3
   00003        xyz         2012/2/12        2012/3/1        2
   00003        xyz         2012/2/12        2012/3/1        4
现在我想以分组的方式在上表中显示数据,即每个唯一Id只有一行,所有代码列合并并显示为一行

    ID         Name          Date1           Date2         Code1    
   00001        abc         2012/1/1         2012/1/10       1
                                                             1
   00002        def         2012/1/12        2012/2/1        2                              
                                                             3
   00003        xyz         2012/2/12        2012/3/1        2
                                                             4

请忽略我的格式样式。当我没有关于即将到来的代码值数量的信息时,这是否可以通过编程实现?提前谢谢

是的,这当然是可能的

根据表格上的限制,例如ID是否严格增加?有几种算法可以被认为完全满足您的要求

但是,我强烈建议不要这样做。直接在DOM上使用jQuery执行此操作将需要大量DOM访问操作,并且速度相对较慢。
最好是在服务器端(我假设数据是在服务器端生成的),或者在客户端(相同数据的数组/对象表示形式)上执行此操作。

此函数将删除与上面单元格内容重复的单元格内容。它不会将它们合并为行span/colspan,但会清空它们

function emptyDittoCells(table) {
    if (!(table instanceof jQuery && table.is("table")))
        throw "bad parameter";

    table.find('tr').each(function(rowElement) {
        var row = $(rowElement);
        var previousRow = $(rowElement).prev('tr');
        if (!previousRow.length) return;

        row.each(function(cellElement, index) {
            var cell = $(cellElement);
            var previousCell = previousRow.children("td:nth-child(" + index + ")"); 

            while (previousCell.data('ditto')) {
                previousCell = previousCell.data('ditto');
            }

            if (hasSameContents(cell, previousCell)) {
                cell.empty()
                    .data('ditto', previousCell);
            }
        });
    });
}

function hasSameContents(a, b) {
    return (a.text() == b.text()); // naive but usable in the simple case
}

未经测试且有点DOM密集,但我认为它会起作用。除了缺少右括号可能出现的语法错误外,我最关心的是td:n子选择器。可以更有力地写成$previousRow.children'td'.getindex.

正如前面所说的,这种转换在服务器端完成得更好

但是,如果表不是太大,并且假设Name、Date1和Date2对于给定的ID具有相同的值,则可以使用jQuery解析表,例如,从头开始重新构建它

一些伪代码:

foreach (row)
{
  foreach (column)
  {
    get ID value;
    if (not yet stored) store data for that ID somewhere else;
    store Code1 value with its ID;
  }
}

foreach (ID stored)
{
  get all related values;
  rebuild table row;
}
我希望有帮助。如果没有,编写一些jQuery代码就不会那么困难了