본문 바로가기
IT 이야기/웹

jQuery 테이블 머지(셀병합) 정확하게 하는 방법 완벽정리

by youngmap 2021. 12. 28.
반응형

다음과 같은 테이블이 있다.

위 테이블을 카테고리 1번 칼럼과 2번 칼럼의 같은 데이터끼리 머지하는 방법을 알아보고자 한다.

HTML 소스는 다음과 같다.

<!DOCTYPE html>
<html>
<head>
<style>
table, th, td {
	border: 1px solid black;
	border-collapse: collapse;
}
</style>
</head>
<table>
	<tr>
		<th>category1</th>
		<th>category2</th>
		<th>category3</th>
	</tr>
	<tr>
		<td class='c1'>AAA</td>
		<td class='c2'>111</td>
		<td>a</td>
	</tr>
	<tr>
		<td class='c1'>AAA</td>
		<td class='c2'>111</td>
		<td>b</td>
	</tr>
	<tr>
		<td class='c1'>AAA</td>
		<td class='c2'>222</td>
		<td>c</td>
	</tr>
	<tr>
		<td class='c1'>AAA-BBB</td>
		<td class='c2'>333</td>
		<td>d</td>
	</tr>
	<tr>
		<td class='c1'>AAA-BBB</td>
		<td class='c2'>333</td>
		<td>e</td>
	</tr>
	<tr>
		<td class='c1'>BBB</td>
		<td class='c2'>444</td>
		<td>f</td>
	</tr>
	<tr>
		<td class='c1'>BBB</td>
		<td class='c2'>555</td>
		<td>g</td>
	</tr>
	<tr>
		<td class='c1'>BBB</td>
		<td class='c2'>555</td>
		<td>h</td>
	</tr>
	<tr>
		<td class='c1'>CCC</td>
		<td class='c2'>666</td>
		<td>i</td>
	</tr>
</table>
</body>
</html>

 

head에 jQuery를 추가하고 셀머지하는 스크립트를 다음과 같이 추가한다.

jQuery의 경로는 각자 알아서.. 

 

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
<script>
$(document).ready(function(){
	
	$(".c1").each(function(){
		var tempString = $(this).text();
		var c1_rows = $(".c1").filter(function(){
			return $(this).text() == tempString;
		});
		if(c1_rows.length > 1){
			c1_rows.eq(0).attr("rowspan", c1_rows.length);
			c1_rows.not(":eq(0)").remove();
		}
	});
	
	$(".c2").each(function(){
		var tempString = $(this).text();
		var c2_rows = $(".c2").filter(function(){
			return $(this).text() == tempString;
		});
		if(c2_rows.length > 1){
			c2_rows.eq(0).attr("rowspan", c2_rows.length);
			c2_rows.not(":eq(0)").remove();
		}
	});
	
});
</script>

결과는 아래와 같이 아주 깔끔하게 머지된다.

 

그런데 인터넷을 보다보면 값을 온전하게 비교하지 않고 contains를 사용해서 "포함되는 단어"로 비교하는 코드가 있다.

아래는 매우 잘못된 코드이다.

 

	$(".c1").each(function(){
		var tempString = $(this).text();
		
		var c1_rows = $(".c1:contains('"+$(this).text()+"')");
		//var c1_rows = $(".c1").filter(function(){
		//	return $(this).text() == tempString;
		//});
		
		if(c1_rows.length > 1){
			c1_rows.eq(0).attr("rowspan", c1_rows.length);
			c1_rows.not(":eq(0)").remove();
		}
	});

AAA 끼리만 병합되어야 하는데 AAA가 포함된 AAA-BBB도 함께 병합된 사례이다.

의도하지 않은 셀 별합 결과

 

인터넷에서 보고 코드를 검증 없이 작성하는 것은 매우 위험하다.

적어도 내가 작성하는 코드가 한 줄 한 줄 어떤 의미를 갖는지 꼭 이해하고 작성해야 한다.

 

반응형