JSFiddle - React, Tailwind, and code Playground

by jun68ykt

HTML

<script src="https://getfirebug.com/firebug-lite-debug.js"></script>
<div id="root" />

CSS

table {
  border: solid 1px #000;
  border-collapse: collapse;
}

td, th {
  border: solid 1px #000;
  padding: 5px;
}

th {
  background-color: #CCC;
}

JavaScript

const array = [
  ["都道府県", "性別"],
  ["神奈川県", "男性"],
  ["神奈川県", "女性"],
  ["東京都", "男性"],
  ["東京都", "女性"],
  ["東京都", "不明"],
  ["群馬県", "女性"],
  ["千葉県", "男性"],
  ["埼玉県", "男性"]
];



const tableRows = array.map((row, i, ary) => {
  let tr = "  <tr>";
  const prevRow = i > 0 ? ary[i-1] : ["", ""];
  
  if (prevRow[0] === row[0] || prevRow[1] === row[1]) {
    const cell = `\n    <td>${row[prevRow[0] === row[0] ? 1 : 0]}</td>`;
    tr += cell;
  } 
  else {
  	row.forEach((str, j) => {
      let cell = `\n    <${i > 0 ? 'td' : 'th'}`;
      let rowSpan = 1;
      for (let k=i+1; k < array.length; ++ k) {
        if (array[k][j] === str) 
          rowSpan ++;
        else
          break;
      }      
      if (rowSpan > 1)
        cell += ` rowspan="${rowSpan}"`;      
      cell += `>${str}</${i > 0 ? 'td' : 'th'}>`;
      tr += cell;
    });
  }  
  tr += "\n  </tr>";
  
  return tr;
});

const tableString = `<table>\n${tableRows.join("\n")}\n</table>`;

console.log(tableString);

const div = document.getElementById("root");

div.innerHTML = tableString;