如何基于对象属性名对数组进行分组合并
发布时间 - 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组件复用【手册】
如何正确选择百度移动适配建站域名?


代普通对象以规避原型链干扰,但日常场景 Object 已足够高效。