<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <table border style="width: 500px;" cellspacing='0'> <thead> <tr> <th>1</th> <th>2</th> <th>3</th> <th>4</th> </tr> </thead> <tbody id="tbody"></tbody> </table> <script> const tbody = document.getElementById('tbody'); let data = [{ name: "1", children: [{ name: "1-1", children: [{ name: "1-1-1", children: [{ name: "1-1-1-1" }] }, { name: "1-1-2", children: [{ name: "1-1-2-1" }, { name: "1-1-2-2" } ] }, { name: "1-1-3", children: [{ name: "1-1-3-1" }, { name: "1-1-3-2" }, { name: "1-1-3-3" } ] }] }, { name: "1-2", children: [{ name: "1-2-1", children: [{ name: "1-2-1-1" }] }] } ] }]; function setRowspan(arr = [], p = null) { arr.forEach((item, index) => { if (item.children && item.children.length > 0) { setRowspan(item.children, item); item.rowspan = item.children.reduce((pre, next) => { pre += next.rowspan || 1; return pre; }, 0); } item.idx = index; item.p = p; }); } setRowspan(data); function createTable(arr = []) { arr.forEach((item, index) => { if ((item.children && item.children.length > 0)) { createTable(item.children); if (item.p && index === 0) { item.str = item.children.reduce((pre, next) => { return (pre += next.str); }, `<td rowspan="${item.rowspan}">${item.name || ""}</td>`); } else { item.str = item.children.reduce((pre, next) => { return (pre += next.str); }, `<tr><td rowspan="${item.rowspan}">${item.name || ""}</td>`); } } else { item.str = ""; if (index !== 0) { item.str = `<tr>`; } item.str += ` <td>${item.name}</td> </tr> `; } }); } createTable(data) let str = ''; data.forEach(item => { str += item.str }) tbody.innerHTML = str </script> </body> </html>
效果:
