React 中使用 map 构建行列转置的动态表格(按类别聚合多日期数据)

发布时间 - 2026-01-06 00:00:00    点击率:

本文介绍如何将嵌套 json 数据(按日期分组、每组含多类别)通过 react 的 map 方法重构为“类别为行、日期为列”的标准表格,解决原始渲染导致重复行的问题。

在 React 中渲染结构化表格时,若原始数据按时间维度嵌套(如每个日期对象包含多个类别子项),直接双层 map 会生成「日期 × 类别」的笛卡尔积式行结构,导致同一类别重复出现——这正是问题中表格错位的根本原因。要实现「类别为行、日期为列」的转置效果,关键在于先归一化数据,再按类别聚合跨日期值

✅ 正确的数据预处理流程

首先,将 category_evolution 扁平化为单一数据流,再按 category 分组构建映射表:

// 1. 合并所有日期下的 data 数组
const flatData = category_evolution.flatMap(item => item.data);

// 2. 按 category 归组:{ "Criptomoedas": [...], "REITs": [...], ... }
const categoryMap = flatData.reduce((acc, item) => {
  const { category } = item;
  if (!acc[category]) acc[category] = [];
  acc[category].push(item);
  return acc;
}, {});
? 推荐使用 flatMap 替代 reduce(...concat),语义更清晰;reduce 初始化为空对象 {},确保类型安全。

✅ 渲染转置表格(JSX)

表头保持原逻辑(日期列),但

需遍历 categoryMap 的每个键(即唯一类别),并在每行中按日期顺序取对应值:

      {category_evolution.map(({ name }) => (
        
      ))}
    
    {Object.keys(categoryMap).map(category => {
      const entries = categoryMap[category]; // 当前类别的所有日期记录
      return (
        
          {/* 按 category_evolution 原始顺序匹配日期,避免错位 */}
          {category_evolution.map(({ name }) => {
            const match = entries.find(item => item.date === name);
            return (
              
            );
          })}
        
      );
    })}
  
Categoria{name}
{category} {match ? match.category_total_brl : '-'}

⚠️ 注意事项与健壮性增强

  • 日期顺序一致性:category_evolution 的原始顺序决定了表头和数据列的对应关系,务必确保 item.date 字段与 name 完全一致(如 "01/02/2025"),否则 find() 将返回 undefined。
  • 空值容错:使用 match ? ... : '-' 防止某类别在某日期缺失时渲染 undefined。
  • 性能优化:若数据量大,可提前构建 dateToIndex 映射,将 find() 改为 O(1) 查找:
    const dateIndex = Object.fromEntries(
      category_evolution.map((item, i) => [item.name, i])
    );
    // 然后 entries[dateIndex[name]] 即可直接索引
  • 可扩展性:如需支持 USD 列,只需复制 并替换 category_total_usd 字段即可。

    通过这种「先归一、再分组、最后按序取值」的模式,你不仅能精准实现目标表格结构,还能轻松适配新增日期或类别,真正让 map 成为动态表格的可靠引擎。


# react  # js  # json  # go  # red  # date  # map  # undefined  # 对象  # tbody  # td  # 性能优化  # 重构  # 笛卡尔  # 再按  # 按日  # 多个  # 还能  # 遍历  # 只需  # 推荐使用  # 并在  # 你不 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel如何实现API版本控制_Laravel版本化API设计方案  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何挑选高效建站主机与优质域名?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  SQL查询语句优化的实用方法总结  javascript日期怎么处理_如何格式化输出  Laravel怎么实现验证码功能_Laravel集成验证码库防止机器人注册  如何快速搭建高效可靠的建站解决方案?  如何快速搭建安全的FTP站点?  JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)  大连网站制作公司哪家好一点,大连买房网站哪个好?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  bootstrap日历插件datetimepicker使用方法  如何确认建站备案号应放置的具体位置?  网站图片在线制作软件,怎么在图片上做链接?  javascript中闭包概念与用法深入理解  浅述节点的创建及常见功能的实现  什么是javascript作用域_全局和局部作用域有什么区别?  Laravel怎么调用外部API_Laravel Http Client客户端使用  通义万相免费版怎么用_通义万相免费版使用方法详细指南【教程】  高性能网站服务器配置指南:安全稳定与高效建站核心方案  Android自定义控件实现温度旋转按钮效果  Laravel观察者模式如何使用_Laravel Model Observer配置  WordPress 子目录安装中正确处理脚本路径的完整指南  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何快速搭建高效WAP手机网站吸引移动用户?  Python并发异常传播_错误处理解析【教程】  如何在万网自助建站平台快速创建网站?  linux top下的 minerd 木马清除方法  INTERNET浏览器怎样恢复关闭标签页_INTERNET浏览器标签恢复快捷键与方法【指南】  html如何与html链接_实现多个HTML页面互相链接【互相】  Laravel怎么在Blade中安全地输出原始HTML内容  Laravel如何使用Vite进行前端资源打包?(配置示例)  php增删改查怎么学_零基础入门php数据库操作必知基础【教程】  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  魔方云NAT建站如何实现端口转发?  潮流网站制作头像软件下载,适合母子的网名有哪些?  Laravel如何使用Blade组件和插槽?(Component代码示例)  Laravel模型事件有哪些_Laravel Model Event生命周期详解  Laravel Seeder填充数据教程_Laravel模型工厂Factory使用  制作旅游网站html,怎样注册旅游网站?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  Laravel如何使用API Resources格式化JSON响应_Laravel数据资源封装与格式化输出  Laravel怎么写单元测试_PHPUnit在Laravel项目中的基础测试入门  JavaScript如何实现类型判断_typeof和instanceof有什么区别  Python企业级消息系统教程_KafkaRabbitMQ高并发应用