var columnToMergeNumber = [2, 3];
$(document).ready(function() {
columnToMergeNumber.sort(function(a, b) {
return b - a;
});
calcmergeCells();
});
// sloop through rows and cells to get current value and value of row span
function calcmergeCells() {
var numberOfRows = $("#MergeTable").find("tr").length + 1;
for (var j = 0; j < columnToMergeNumber.length; j++) {
for (var i = 1; i < numberOfRows; i++) {
var currentValue = $("#MergeTable tr:nth-child(" + i + ")")
.find("td:nth-child(" + columnToMergeNumber[j] + ")")
.html();
var times = mergeNTimes(currentValue, 1, i, columnToMergeNumber[j]);
mergeCells(i, times, columnToMergeNumber[j]);
i += times - 1;
}
}
}
// Find out the value of rpowspan
function mergeNTimes(currentValue, times, index, column) {
var nextValue = $("#MergeTable tr:nth-child(" + (index + 1) + ")")
.find("td:nth-child(" + column + ")")
.html();
if (nextValue == currentValue) {
return mergeNTimes(currentValue, times + 1, index + 1, column);
} else {
return times;
}
}
// Delete cells and add rowspan
function mergeCells(fromRow, times, column) {
for (var i = fromRow + 1; i < fromRow + times; i++) {
$("#MergeTable tr:nth-child(" + i + ")")
.find("td:nth-child(" + column + ")")
.remove();
}
$("#MergeTable tr:nth-child(" + fromRow + ")")
.find("td:nth-child(" + column + ")")
.attr("rowspan", times);
}
table {
border-collapse: collapse;
}
table td {
border: 1px solid black;
min-width: 100px;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table id="MergeTable">
<tr>
<td>1</td>
<td>a</td>
<td>c</td>
</tr>
<tr>
<td>2</td>
<td>a</td>
<td>d</td>
</tr>
<tr>
<td>3</td>
<td>a</td>
<td>c</td>
</tr>
<tr>
<td>4</td>
<td>b</td>
<td>c</td>
</tr>
<tr>
<td>5</td>
<td>b</td>
<td>c</td>
</tr>
</table>