如何基于对象属性名对数组进行分组合并

发布时间 - 2025-12-27 00:00:00    点击率:

本文介绍如何使用 javascript 的 `reduce` 方法,按指定属性(如 category)对对象数组进行分组,并将同组对象的其他属性合并到一个对象中,适用于处理分类统计、数据聚合等场景。

在实际开发中,我们常需将扁平的对象数组按某个分类字段(如 category)聚合成结构更紧凑的分组数据。例如,原始数据中每个对象代表一项活动及其价格,但类别重复出现;目标是将同一类别的所有子项(如 'Hang with Friends'、Chill)合并到一个对象中,保留 category 字段并动态添加其余键值对。

✅ 正确实现方式(推荐)

使用 Array.prototype.reduce() 配合一个临时对象作为累加器(acc),以 category 值为键存储分组对象,并用 Object.assign() 合并当前项:

const data = [
  { category: 'Entertainment', 'Hang with Friends': 100 },
  { category: 'Entertainment', Chill: 30 },
  { category: 'Health', Yoga: 40 },
  { category: 'Health', Birthday: 200 }
];

const grouped = Object.values(
  data.reduce((acc, curr) => {
    // 若 acc 中尚无该 category 对应的对象,则初始化为空对象
    const target = (acc[curr.category] ??= {});
    // 将 curr 的所有自有属性合并到 target 中(包括 category)
    Object.assign(target, curr);
    return acc;
  }, {})
);

console.log(grouped);
// 输出:
// [
//   { category: 'Entertainment', 'Hang with Friends': 100, Chill: 30 },
//   { category: 'Health', Yoga: 40, Birthday: 200 }
// ]
? 关键点解析: acc[curr.category] ??= {} 是空值合并赋值,确保每个 category 对应唯一对象引用; Object.assign(target, curr) 安全覆盖或新增属性(若存在同名 key,后者值生效); 最终用 Object.values() 提取所有分组对象,丢弃中间的键名(即 category 字符串)。

? 适配结构化数据格式(推荐数据建模方式)

你后续提供的标准化格式更清晰、更易维护:

const structuredData = [
  { category: 'Entertainment', subCategory: 'Hang with Friends', price: 100 },
  { category: 'Entertainment', subCategory: 'Chill', price: 30 },
  { category: 'Health', subCategory: 'Yoga', price: 40 },
  { category: 'Health', subCategory: 'Birthday', price: 200 }
];

此时建议显式构造目标结构,避免直接合并 curr(防止 category 和 subCategory 冲突):

const groupedStructured = Object.values(
  structuredData.reduce((acc, { category, subCategory, price }) => {
    const group = (acc[category] ??= { category });
    group[subCategory] = price; // 动态添加子类目与价格映射
    return acc;
  }, {})
);

console.log(groupedStructured);
// 输出:
// [
//   { category: 'Entertainment', 'Hang with Friends': 100, Chill: 30 },
//   { category: 'Health', Yoga: 40, Birthday: 200 }
// ]

⚠️ 注意事项与最佳实践

  • 不要用 category 字符串直接索引数组:字符串不能作为数组下标参与数值运算,必须使用对象({})或 Map 作哈希表;
  • 避免副作用与可变状态:Object.assign() 修改的是已有对象,确保 target 是新引用或受控对象;
  • TypeScript 用户注意类型安全
    const grouped = Object.values(
      data.reduce>>((acc, curr) => {
        const target = (acc[curr.category] ??= {});
        Object.assign(target, curr);
        return acc;
      }, {})
    );
  • 性能考量:对于超大数据集(>10k 条),可考虑使用 Map 替代普通对象以规避原型链干扰,但日常场景 Object 已足够高效。

通过合理运用 reduce + 对象哈希 + Object.values(),你可以简洁、健壮地完成基于任意字符串字段的数组分组合并任务。


# javascript  # java  # go  # typescript  # 大数据  # ai  # 键值对  # red 


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


相关推荐: Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?  如何用已有域名快速搭建网站?  制作电商网页,电商供应链怎么做?  如何快速配置高效服务器建站软件?  Laravel如何设置自定义的日志文件名_Laravel根据日期或用户ID生成动态日志【技巧】  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  Laravel如何实现邮件验证激活账户_Laravel内置MustVerifyEmail接口配置【步骤】  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  米侠浏览器网页背景异常怎么办 米侠显示修复  Windows Hello人脸识别突然无法使用  教你用AI将一段旋律扩展成一首完整的曲子  googleplay官方入口在哪里_Google Play官方商店快速入口指南  Android Socket接口实现即时通讯实例代码  Laravel如何使用查询构建器?(Query Builder高级用法)  网站制作价目表怎么做,珍爱网婚介费用多少?  Laravel如何实现数据导出到CSV文件_Laravel原生流式输出大数据量CSV【方案】  利用 Google AI 进行 YouTube 视频 SEO 描述优化  Laravel如何发送系统通知_Laravel Notifications实现多渠道消息通知  IOS倒计时设置UIButton标题title的抖动问题  如何用VPS主机快速搭建个人网站?  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  php打包exe后无法访问网络共享_共享权限设置方法【教程】  Laravel如何生成和使用数据填充?(Seeder和Factory示例)  如何续费美橙建站之星域名及服务?  制作企业网站建设方案,怎样建设一个公司网站?  Laravel如何优化应用性能?(缓存和优化命令)  laravel怎么为应用开启和关闭维护模式_laravel应用维护模式开启与关闭方法  北京网页设计制作网站有哪些,继续教育自动播放怎么设置?  如何打造高效商业网站?建站目的决定转化率  Win11搜索不到蓝牙耳机怎么办 Win11蓝牙驱动更新修复【详解】  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Python文件流缓冲机制_IO性能解析【教程】  Laravel用户密码怎么加密_Laravel Hash门面使用教程  网页设计与网站制作内容,怎样注册网站?  微信公众帐号开发教程之图文消息全攻略  如何快速搭建高效香港服务器网站?  什么是JavaScript解构赋值_解构赋值有哪些实用技巧  香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南  高性能网站服务器部署指南:稳定运行与安全配置优化方案  如何在Tomcat中配置并部署网站项目?  大型企业网站制作流程,做网站需要注册公司吗?  高端建站如何打造兼具美学与转化的品牌官网?  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  HTML透明颜色代码在Angular里怎么设置_Angular透明颜色使用指南【详解】  Bootstrap整体框架之JavaScript插件架构  Laravel中间件起什么作用_Laravel Middleware请求生命周期与自定义详解  Laravel怎么使用Blade模板引擎_Laravel模板继承与Component组件复用【手册】  如何正确选择百度移动适配建站域名?