复杂表合并javascript&;jquery算法

复杂表合并javascript&;jquery算法,javascript,jquery,html,algorithm,Javascript,Jquery,Html,Algorithm,我有一个相当独特的问题,我很难解决。我有一张2 x 3的桌子,如下图所示 \u 1\uuuuuuuuuuuuuuuu2\uuuu 1-|uuuuuu|uuuuu| 2-|uuuuuu|uuuuu| 3-||||| 数据填充到表的单元格中。有时,列或行中的数据可能相同。例如,如果(1,1)和(1,2)具有相同的数据。在某些情况下,(1,1)、(1,2)和(1,3)都可以具有相同的数据。如果单元格中的值相同且相邻,则需要合并这些值。例如,如果(1,1)和(1,2)的值均为“100”,则两个单元格合并

我有一个相当独特的问题,我很难解决。我有一张2 x 3的桌子,如下图所示

\u 1\uuuuuuuuuuuuuuuu2\uuuu
1-|uuuuuu|uuuuu|
2-|uuuuuu|uuuuu|
3-|||||

数据填充到表的单元格中。有时,列或行中的数据可能相同。例如,如果(1,1)和(1,2)具有相同的数据。在某些情况下,(1,1)、(1,2)和(1,3)都可以具有相同的数据。如果单元格中的值相同且相邻,则需要合并这些值。例如,如果(1,1)和(1,2)的值均为“100”,则两个单元格合并。我使用jquery手动完成了这项工作,如:

(1,2).hide();
(1,1).attr("rowspan", "2");
我隐藏(1,2)单元格而不是删除,因为可以将表重置为原始2x3,然后根据需要重新填充。手动操作,效果很好,但我需要一个动态方法。以下是需要实现的总体目标

  • 如果两个垂直相邻单元格或其各自列中的三个垂直相邻单元格的值相等,则这些单元格合并在一起
  • 行单元格,如(1,1)和(2,1)可以有重复的数据,并且永远不会合并
  • 作为参考,兼容合并的单元组为{(1,1)、(1,2)}、{(1,1)、(1,2)、(1,3)}、{(1,2)、(1,3)}、{(2,1)、(2,2)}、{(2,1)、(2,2)、(2,3)}、{(2,2)、(2,3)}
  • 一次可以发生多个合并。例如:{(1,1)、(1,2)}具有相同的数据,{(2,1)、(2,2)、(2,3)}具有相同的数据。两个组分别合并

我的主要问题是,我将如何着手编写一个算法来实现这一点,而不必写出所有可能的情况。有人能给我举一个有用的例子吗?我意识到这很复杂,所以请随意提问以进行澄清。非常感谢您的光临。这是一个巨大的帮助

因为它总是2x3,所以你可以用蛮力强迫它

这肯定可以优化,这只是快速和肮脏。您肯定希望保存对单元格的引用,而不是多次调用
eq
。对于第二列,您也必须这样做

如果表格可以更改大小,您可能希望在列中的每个单元格上循环,对于匹配的每个区域,隐藏匹配项并设置行跨度。相对容易,但在这里并不真正需要。

像这样吗? 可用于任意行/列

想法:我们有
矩阵和
span
矩阵。
span
的值为

0=隐藏此单元格

1=正常细胞

x>1=行跨度为x的单元格

按列按直接顺序迭代,按行按相反顺序迭代。如果某个单元格的值等于它下面的值,则增加该单元格的
span
,并删除下面单元格的
span

for (var col = 0; col < cols; col++) {
    for (var row = rows - 2; row >= 0; row--) {
        if (values[row][col] == values[row + 1][col]) {
            span[row][col] = span[row + 1][col] + 1;
            span[row + 1][col] = 0;
        }
    }
}
for(var col=0;col=0;行--){
if(值[行][col]==值[行+1][col]){
span[行][col]=span[行+1][col]+1;
span[行+1][col]=0;
}
}
}

完成后,您可以使用
span
生成完整的表格,或显示/隐藏单元格并设置其行span属性。

表格是否始终为2x3?听起来像是……卡诺映射的工作。请参见该表最初始终为2 x 3。单元格的合并可能导致表格变为2 x 2或2 x 1。能否将数据计算与演示分离?也就是说,首先处理组合检查,然后根据结果绘制一个表,不是更容易吗?@diodeus听起来在理论上很有希望,但我不知道如何实现这样的概念。我实际上有一个版本bruteforced,它工作得很好。我希望对它进行优化。对于一个小型静态表,bruteforce将是性能最佳的。更具动态性的东西只会增加开销。我理解。我对我已经编写的bruteforce代码很满意。我之所以发布这篇文章,只是出于对其他解决方案的好奇。谢谢你的回复,很酷。我找到了最好的答案。我将尝试实施此解决方案。谢谢
for (var col = 0; col < cols; col++) {
    for (var row = rows - 2; row >= 0; row--) {
        if (values[row][col] == values[row + 1][col]) {
            span[row][col] = span[row + 1][col] + 1;
            span[row + 1][col] = 0;
        }
    }
}