将嵌套的 stats 数组展开为对象顶层的键值对

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

本文介绍如何使用 javascript 将包含 `statname`/`statvalue` 对的嵌套数组(如球员统计数据)扁平化,将其动态转换为外层对象的自有属性,从而实现结构简化与数据可访问性提升。

在实际数据处理中,常遇到类似「统计项以对象数组形式嵌套在主体对象内」的结构——例如每位球员的多项指标(Avg、Total Strokes 等)被封装在 stats 数组中,每个元素形如 { statName: "Avg", statValue: "70.356" }。这种结构虽利于序列化,但不利于直接访问(如 player.Avg),也不符合多数前端渲染或分析库对扁平对象的偏好。理想的输出是将 stats 中每项 statName 作为键、statValue 作为值,提升至外层对象层级

核心思路是:对原始数组执行 .map(),对每个对象解构出 stats 和其余字段(...rest),再利用 .reduce() 将 stats 数组逐项累积为一个新对象,并通过计算属性名 [statName] 动态赋值。最终用展开运算符 ... 合并 rest 与生成的统计对象。

以下是完整实现代码:

const output = input.map(({ stats, ...rest }) => ({
  ...rest,
  ...stats.reduce((acc, { statName, statValue }) => ({
    ...acc,
    [statName]: statValue
  }), {})
}));

关键点解析:

  • ({ stats, ...rest }):安全解构,分离出 stats 数组与其余所有字段(自动排除 stats);
  • stats.reduce(..., {}):以空对象为初始值,遍历每个统计项,将 statName 作为动态键、statValue 作为对应值合并进累加器;
  • ...acc 与 ...rest 均依赖浅拷贝,适用于本例中值均为基本类型(字符串、数字)的场景;
  • 若 stats 中

    存在重复 statName,后出现的会覆盖前者(符合 reduce 累积逻辑)。

⚠️ 注意事项:

  • 若 stats 可能为 null 或 undefined,建议添加守卫逻辑:stats?.reduce(...) || {};
  • 若需保留原始 stats 字段,可跳过解构剔除,改为显式保留:{ ...rest, stats, ...transformedStats };
  • 对于超大数据集(数千条以上),reduce 内频繁对象展开可能带来轻微性能开销,此时可改用 for...of 循环 + Object.assign 优化。

该方法简洁、可读性强,无需引入外部库,完美契合现代 JavaScript 开发实践,是处理“键值对数组→扁平对象”映射的经典范式。


# javascript  # java  # 前端  # 大数据  # 键值对  # red 


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


相关推荐: LinuxShell函数封装方法_脚本复用设计思路【教程】  php485函数参数是什么意思_php485各参数详细说明【介绍】  如何在云指建站中生成FTP站点?  使用Dockerfile构建java web环境  Swift中循环语句中的转移语句 break 和 continue  青岛网站建设如何选择本地服务器?  三星网站视频制作教程下载,三星w23网页如何全屏?  *服务器网站为何频现安全漏洞?  php静态变量怎么调试_php静态变量作用域调试技巧【解答】  如何在云虚拟主机上快速搭建个人网站?  Win11怎么开启自动HDR画质_Windows11显示设置HDR选项  网易LOFTER官网链接 老福特网页版登录地址  专业商城网站制作公司有哪些,pi商城官网是哪个?  php在windows下怎么调试_phpwindows环境调试操作说明【操作】  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何用搬瓦工VPS快速搭建个人网站?  Laravel如何使用Blade模板引擎?(完整语法和示例)  什么是javascript作用域_全局和局部作用域有什么区别?  laravel怎么用DB facade执行原生SQL查询_laravel DB facade原生SQL执行方法  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  WordPress 子目录安装中正确处理脚本路径的完整指南  Laravel怎么解决跨域问题_Laravel配置CORS跨域访问  如何在服务器上三步完成建站并提升流量?  Android okhttputils现在进度显示实例代码  韩国服务器如何优化跨境访问实现高效连接?  Laravel如何实现事件和监听器?(Event & Listener实战)  JS中页面与页面之间超链接跳转中文乱码问题的解决办法  家族网站制作贴纸教程视频,用豆子做粘帖画怎么制作?  Claude怎样写结构化提示词_Claude结构化提示词写法【教程】  html5audio标签播放结束怎么触发事件_onended回调方法【教程】  标题:Vue + Vuex + JWT 身份认证的正确实践与常见误区解析  如何在浏览器中启用Flash_2025年继续使用Flash Player的方法【过时】  如何自定义建站之星网站的导航菜单样式?  如何快速搭建虚拟主机网站?新手必看指南  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  Laravel如何使用缓存系统提升性能_Laravel缓存驱动和应用优化方案  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】  网站建设保证美观性,需要考虑的几点问题!  Laravel如何实现用户注册和登录?(Auth脚手架指南)  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  如何在香港服务器上快速搭建免备案网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  晋江文学城电脑版官网 晋江文学城网页版直接进入  JS去除重复并统计数量的实现方法  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel Docker环境搭建教程_Laravel Sail使用指南  如何快速搭建自助建站会员专属系统?  标题:Vue + Vuex 项目中正确使用 JWT 进行身份认证的实践指南  Laravel如何实现API速率限制?(Rate Limiting教程)