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代码就不会那么困难了