D3.js 테이블 그리기 - Object.keys(), map()
D3.js의 테이블을 생성하는 방법을 소개한다.
배열의 경우
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>D3 Table</title>
<script src="https://d3js.org/d3.v7.min.js"></script>
</head>
<body>
<script>
var dataset = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9],
[10, 11, 12],
];
d3.select("body")
.append("table")
.attr("border", "1") // 테두리 표시
.append("tbody")
.selectAll("tr")
.data(dataset)
.enter()
.append("tr")
.selectAll("td")
.data(function(row) { return row; })
.enter()
.append("td")
.text(function(d) { return d; });
</script>
</body>
</html>
객체의 경우
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>D3 Table</title>
<script src="https://d3js.org/d3.v6.min.js"></script>
</head>
<body>
<script>
var dataset = [
{ "name": "A", "para1": 0, "para2": 5 },
{ "name": "B", "para1": 1, "para2": 6 },
{ "name": "C", "para1": 2, "para2": 7 },
{ "name": "D", "para1": 3, "para2": 8 },
{ "name": "E", "para1": 4, "para2": 9 }
]
var columns = Object.keys(dataset[0]);
var table = d3.select("body")
.append("table")
.attr("border", "1") // 테두리 표시;
table.append("thead")
.append("tr")
.selectAll("th")
.data(columns)
.enter()
.append("th")
.text(function(d) { return d; });
table.append("tbody")
.selectAll("tr")
.data(dataset)
.enter()
.append("tr")
.selectAll("td")
.data(function(row) {
return columns.map(function(column) {
return {column: column, value: row[column]};
})
})
.enter()
.append("td")
.text(function(d) { return d.value; });
</script>
</body>
</html>
Object.keys(dataset[0])
는 객체의 키를 배열로 받아오는 함수이다.
var columns = Object.keys(dataset[0]);
테이블 헤더를 만들기 위해 dataset
의 첫 번째 행의 문자열을 추출한다.
Object.keys({ "name": "A", "para1": 0, "para2": 5 })
반환 결과:
["name", "para1", "para2"]
또, 40행째의 d3.entries()는, 오브젝트의 키와 값을 배열로서 꺼내는 함수입니다.
객체를 data 함수에 dataset
를 지정하면,
.data(dataset)
dataset
데이터를 아래와 같이 1개의 행을 차례대로 row
이라는 객체로 함수의 인자로 넘기게 된다.
.data(function(row) {
return columns.map(function(column) {
return {column: column, value: row[column]};
})
})
결과적으로는 row
단위로 받아와서 {column: 컬럼명, value: 값}
와 같은 형태를 만든다.
[
{"column" : "name", "value" : "A"},
{"column" : "para1", "value" : 0},
{"column" : "para2", "value" : 5}
]
최종 수정 : 2024-01-18