You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于多层级JSON数据使用jQuery生成HTML表格?

基于任意层级JSON生成嵌套HTML表格(jQuery实现)

我正在用jQuery配合HTML开发,需要基于JSON数据生成HTML表格。如果是无层级的JSON实现起来很简单,但我需要一个能适配任意层级JSON对象的灵活方案。见过一些用列表的实现,但我的场景只需要处理对象类型。以下是示例:

示例JSON数据

{
    "A": {
        "B": {
            "B1": "B1-a",
            "B2": "B2-a"
        },
        "C": {
            "Ca": "Cb"
        }
    },
    "D": {
        "E": {
            "E1": "E1-a",
            "E2": "E2-a"
        },
        "F": {
            "Fa": "Fb"
        }
    }
}

目标生成的HTML表格

<table>
    <tbody id="JSONTable">
        <tr>
            <td rowspan="5">A</td>
        </tr>
        <tr>
            <td rowspan="3">B</td>
        </tr>
        <tr>
            <td>B1</td>
            <td>B1-a</td>
        </tr>
        <tr>
            <td>B2</td>
            <td>B2-a</td>
        </tr>
        <tr>
            <td>C</td>
            <td>Ca</td>
            <td>Cb</td>
        </tr>
        <tr>
            <td rowspan="5">D</td>
        </tr>
        <tr>
            <td rowspan="3">E</td>
        </tr>
        <tr>
            <td>E1</td>
            <td>E1-a</td>
        </tr>
        <tr>
            <td>E2</td>
            <td>E2-a</td>
        </tr>
        <tr>
            <td>F</td>
            <td>Fa</td>
            <td>Fb</td>
        </tr>
    </tbody>
</table>

实现思路与代码

核心思路是递归遍历JSON对象,先计算每个节点需要占据的行数(rowspan),再根据层级生成对应的表格行:

  • 递归计算每个节点的子节点总行数,确定当前节点的rowspan值。
  • 按层级生成表格行:父节点单独占一行(仅包含当前节点的td,带rowspan),子节点依次生成对应行。
  • 处理叶子节点(值为非对象类型)时,直接生成包含键和值的行。

以下是完整的jQuery实现代码:

// 计算节点的总行数(包括子节点)
function calculateRowCount(obj) {
    let count = 0;
    for (const key in obj) {
        if (typeof obj[key] === 'object' && obj[key] !== null) {
            const childCount = calculateRowCount(obj[key]);
            count += childCount + 1; // 子节点总行数 + 当前节点的占位行
        } else {
            count += 1; // 叶子节点占一行
        }
    }
    return count;
}

// 递归生成表格内容
function generateTableRows(obj, $container, depth = 0) {
    for (const key in obj) {
        const value = obj[key];
        const rowCount = typeof value === 'object' && value !== null ? calculateRowCount(value) + 1 : 1;
        
        // 生成当前节点的占位行(仅显示当前键,带rowspan)
        const $placeholderRow = $('<tr></tr>');
        $placeholderRow.append($('<td></td>').attr('rowspan', rowCount).text(key));
        // 前面补上空td,对应层级缩进
        for (let i = 0; i < depth; i++) {
            $placeholderRow.prepend($('<td></td>'));
        }
        $container.append($placeholderRow);
        
        // 递归处理子节点
        if (typeof value === 'object' && value !== null) {
            generateTableRows(value, $container, depth + 1);
        } else {
            // 叶子节点生成包含键和值的行
            const $leafRow = $('<tr></tr>');
            // 前面补上空td,对应层级缩进
            for (let i = 0; i < depth + 1; i++) {
                $leafRow.append($('<td></td>'));
            }
            $leafRow.append($('<td></td>').text(value));
            $container.append($leafRow);
        }
    }
}

// 初始化调用
$(document).ready(function() {
    const jsonData = {
        "A": {
            "B": {
                "B1": "B1-a",
                "B2": "B2-a"
            },
            "C": {
                "Ca": "Cb"
            }
        },
        "D": {
            "E": {
                "E1": "E1-a",
                "E2": "E2-a"
            },
            "F": {
                "Fa": "Fb"
            }
        }
    };
    
    const $tableBody = $('#JSONTable');
    $tableBody.empty();
    generateTableRows(jsonData, $tableBody);
});

代码说明

  • calculateRowCount:递归计算当前节点及其所有子节点需要占据的总行数,用于设置父节点的rowspan属性。
  • generateTableRows:递归遍历JSON对象,生成对应的表格行。父节点生成带rowspan的占位行,子节点根据层级补上空td实现缩进,叶子节点直接生成键值行。
  • 层级缩进通过在每行前添加空td实现,确保表格结构对齐。

内容的提问来源于stack exchange,提问作者ricardvs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 08:18:15