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

时间:2012-10-10 22:44:35

标签: 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         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只有1行,所有代码列合并并显示为1行。

    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

请忽略我的格式化风格。当我没有关于代码值数量的信息时,这可以编程吗?提前致谢。

3 个答案:

答案 0 :(得分:0)

是的,这当然是可能的。

根据表格上的限制(例如,ID严格增加?),可以想到几种算法可以完全满足您的要求。

但是,我强烈建议反对它。直接在DOM上使用jQuery执行此操作将需要大量的DOM访问操作,并且相对较慢。 在服务器端执行此操作会更好,我认为生成数据,或者在客户端上执行相同数据的数组/对象表示。

答案 1 :(得分:0)

此函数将删除复制其上方单元格内容的单元格内容。它不会合并它们(例如rowspan / 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:nth-child()选择器。这可以更加健壮地写成$(previousRow.children('td').get(index))

答案 2 :(得分:0)

如前所述,这种转换在服务器端更好。

但是如果表不是太大,并且假设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代码就不那么困难了。