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