You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

求助:用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

火山引擎 最新活动