求助:用JavaScript读取嵌套JSON生成带搜索与导出的HTML表格
嘿,我来帮你搞定这个嵌套JSON转表格的问题!你遇到的核心难点肯定是解析那个嵌套的Id对象对吧?别担心,我一步步给你捋清楚思路,附上伪代码和关键实现细节,你可以照着改:
第一步:先把原始JSON转成好处理的数组格式
原始JSON是用Person1、Person2作为键的结构,直接遍历不太方便,先把它转成数组,顺便把嵌套的ID提取出来:
// 你的原始JSON数据 const rawPersonData = { "Person1": { "updateddate": "2017-05-10", "desc": "new joinee", "Id": { "12345": { "locallinks": [ "local_link1" ] } }, "externallinks": [ "external_link1" ], "updateduser": "admin" }, "Person2": { "updateddate": "2017-06-10", "desc": "existing", "Id": { "12346": { "locallinks": [ "local_link1" ] } }, "externallinks": [ "external_link1" ], "updateduser": "user" }, "Person3": { "updateddate": "2017-06-10", "desc": "new joinee", "Id": { "12347": { "locallinks": [ "local_link1" ] } }, "externallinks": [ "external_link1" ], "updateduser": "admin" } }; // 转换为结构化数组,提取嵌套ID const formattedData = Object.entries(rawPersonData).map(([personName, details]) => { // 提取Id对象里的唯一键(就是你要的ID值) const userId = Object.keys(details.Id)[0]; return { person: personName, updatedDate: details.updateddate, desc: details.desc, id: userId, externalLinks: details.externallinks.join(', '), // 把数组转成字符串方便表格显示 updatedUser: details.updateduser }; });
第二步:动态生成HTML表格
有了格式化后的数组,就可以循环创建表格的表头和每一行:
function buildPersonTable(data) { const table = document.createElement('table'); table.classList.add('person-table'); // 可以加个类方便样式 // 创建表头 const headerRow = document.createElement('tr'); const tableHeaders = ['Person', 'Updated Date', 'Desc', 'ID', 'External Links', 'Updated User']; tableHeaders.forEach(headerText => { const th = document.createElement('th'); th.textContent = headerText; headerRow.appendChild(th); }); table.appendChild(headerRow); // 创建表格内容行 data.forEach(person => { const row = document.createElement('tr'); // 按表头顺序填充单元格内容 const cellContents = [ person.person, person.updatedDate, person.desc, person.id, person.externalLinks, person.updatedUser ]; cellContents.forEach(content => { const td = document.createElement('td'); td.textContent = content; row.appendChild(td); }); table.appendChild(row); }); return table; } // 把表格添加到页面的容器里 document.getElementById('table-wrapper').appendChild(buildPersonTable(formattedData));
第三步:实现实时搜索功能
给搜索框加个监听事件,输入时过滤数据并重新渲染表格:
const searchBox = document.getElementById('search-input'); searchBox.addEventListener('input', (e) => { const searchKeyword = e.target.value.toLowerCase(); // 过滤数据:匹配任意字段的内容 const filteredResults = formattedData.filter(item => { return Object.values(item).some(value => value.toString().toLowerCase().includes(searchKeyword) ); }); // 清空旧表格,渲染新的过滤结果 const tableWrapper = document.getElementById('table-wrapper'); tableWrapper.innerHTML = ''; tableWrapper.appendChild(buildPersonTable(filteredResults)); });
第四步:导出表格数据到Excel
我们可以把数据转成CSV格式(Excel直接支持打开),用Blob和a标签实现下载:
function exportToExcel(data) { // 构建CSV内容,处理带特殊字符的字段 const csvHeaders = ['Person', 'Updated Date', 'Desc', 'ID', 'External Links', 'Updated User']; const csvRows = [ csvHeaders.join(','), ...data.map(item => [ item.person, item.updatedDate, `"${item.desc}"`, // 带逗号的字段用双引号包裹,避免CSV解析错误 item.id, `"${item.externalLinks}"`, item.updatedUser ].join(',')) ]; const csvContent = csvRows.join('\n'); // 创建下载链接 const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' }); const downloadUrl = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = downloadUrl; link.setAttribute('download', 'person_records.csv'); // 下载的文件名 document.body.appendChild(link); link.click(); document.body.removeChild(link); } // 给导出按钮绑定点击事件 document.getElementById('export-btn').addEventListener('click', () => { exportToExcel(formattedData); });
一些小提示:
- 如果你的
Id对象可能有多个键(比如一个人有多个ID),可以改成Object.keys(details.Id).join(', ')来拼接所有ID - 搜索功能可以优化成只匹配特定字段(比如只搜Person名称或ID),修改
filter里的判断逻辑就行 - 可以给表格加一些CSS样式,让它看起来更美观
内容的提问来源于stack exchange,提问作者user3202086




