复杂表头

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>复杂表头</title>
</head>
<body>
    
    <script type="text/javascript">
        var data = [
            {
                key: 'A',
                nodes: 4,
                children: [
                    { key: 'A1' },
                    { key: 'A2', nodes: 2,
                        children: [
                            { key: 'A21' },
                            { key: 'A22', nodes: 1, children: [{ key: 'A221' }] }
                        ] 
                    },
                    { key: 'A3' }
                ]
            },
            {
                key: 'B',
                nodes: 4,
                children: [
                    { key: 'B1', nodes: 2, 
                        children: [
                            { key: 'B11', nodes: 1, children: [{ key: 'B111' }] },
                            { key: 'B12' }
                        ] 
                    },
                    { key: 'B2' },
                    { key: 'B3' }
                ]
            }
        ];

        

        function printColumn(row, layer, index = 0) {
            if (row.length === 0) return '';

            var nextRow = [];
            var tpl = '<tr>';

            row.forEach(v => {
                if (v.nodes) {
                    tpl += '<td colspan="' + v.nodes + '">' + v.key + '</td>';
                    nextRow = nextRow.concat(v.children);
                } else {
                        tpl += '<td rowspan="'+(layer - index)+'">' + v.key + '</td>';
                }

            });

            tpl += '</tr>';

            if (nextRow.length) {
                tpl += printColumn(nextRow, layer, index + 1);
            }

            return tpl;
        }

        function printRow(col, layer, index = 0) {
            if (layer === index) return '';

            col.forEach(v => {
                let size = layer - index - 1;
                tpl += '<tr>';
                if (v.nodes) {
                    tpl += '<td rowspan="' + (v.nodes) + '">' + v.key + '</td>';
                    printCell(v.children.shift(), layer, index + 1, size);
                    tpl += '</tr>';
                    if (v.children.length) {
                        printRow(v.children, layer, index + 1);
                    }
                } else {
                    tpl += '<td colspan="' + (size + 1) + '">' + v.key + '</td></tr>';
                }
            });
        }

        function printCell(col, layer, index, size) {
            if (col.nodes) {
                tpl += '<td rowspan="'+ col.nodes +'">' + col.key + '</td>';
                printCell(col.children.shift(), layer, index + 1, size - 1);
                if (col.children.length) {
                    printRow(col.children, layer, index + 1, size);
                }
            } else {
                tpl += '<td colspan="' + size + '">' + col.key + '</td>';
            }
        }


        var table = '<table border=1>';
        table += printColumn(data, 4);
        table += '</table>';
        
        var tpl = '<table border=1>';
        printRow(data, 4);
        tpl += '</table>';

        document.write(table + tpl);
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/zhoulingfeng/p/7822908.html