对象按分类值分组并生成带变体数组的方法
在日常前端开发中,我们经常需要处理一类常见需求:手头有一组扁平化数据,例如商品列表,希望按照品类进行聚合——将同一品类的所有商品挂载到该品类第一个出现的商品之下,形成“主商品 + 变体”的层级结构。如果某个品类只有一件商品,则将其变体字段设为 `null`。这看似只是一个数据透视的小任务,但实现时,选择合适的方法能显著提升效率。
接下来,本文将分享一套经过实践验证的两阶段处理方案,兼顾执行性能与代码可读性,适用于商品管理、内容聚合、配置分组等多种业务场景。
---
### 第一步:分组聚合——使用 `reduce` 构建哈希映射
以目标字段(例如 `category`)作为键,遍历原始数组,将相同分类的对象收集到同一个数组内。这一步的时间复杂度为 O(n),且代码非常直观:
```ja vascript
const grouped = products.reduce((acc, product) => {
const { category } = product;
if (!acc[category]) acc[category] = [];
acc[category].push(product);
return acc;
}, {});
```
### 第二步:结构转换——通过 `Object.keys().map()` 生成最终结果
获得分组结果后,遍历每一个分类键,提取该分类中第一个对象的 `position` 和 `category` 作为主项信息,再根据该分类的总对象数量决定 `variants` 的值——若多于一个,则将整个数组放入;否则设为 `null`。
```ja vascript
const result = Object.keys(grouped).map(key => {
const items = grouped[key];
return {
position: items[0].position,
category: key,
variants: items.length > 1 ? items : null
};
});
```
用一个实际示例验证,结果正如预期:
```ja vascript
const products = [
{ position: 1, category: "jeans" },
{ position: 2, category: "tees" },
{ position: 3, category: "dress" },
{ position: 4, category: "dress" },
{ position: 5, category: "dress" },
];
// 输出:
// [
// { position: 1, category: "jeans", variants: null },
// { position: 2, category: "tees", variants: null },
// { position: 3, category: "dress", variants: [ { position:3, category:"dress" }, { position:4, category:"dress" }, { position:5, category:"dress" } ] }
// ]
```
---
### ? 关键注意事项
- **分组字段灵活扩展**:若业务需要按多个字段联合分组(例如 `category` + `brand`),只需将哈希表的键改为 `"${category}-${brand}"`,其余逻辑无需调整。
- **首项 position 仅作示例**:上述代码取得第一个对象的 `position`,如果实际需求是取最小或最大值,可替换为 `Math.min(...items.map(p => p.position))` 或 `Math.max(...)`,灵活适配。
- **空数组安全处理**:若原始数组为空,`Object.keys(grouped).map(...)` 将直接返回空数组 `[]`,无需额外判空。
- **`variants: null` 的设计优势**:这种输出结构在模板渲染中非常便利,例如在 Vue/React 中通过 `v-if="item.variants"` 即可控制变体区域的显示与隐藏。
该模式的核心优势在于:仅需单次遍历 + 哈希查找,整体时间复杂度为 O(n);代码结构清晰,边界情况处理完善。无论是商品列表的归类展示,还是配置选项的合并,都可以直接套用。下次遇到扁平数据需要“按组分构建变体”的场景时,不妨将其作为标准解法记录下来。
来源:https://www.php.cn/faq/2696132.html
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
Layui弹出层监听子页面键盘快捷键实现方法
子页面键盘事件监听需在DOM加载完成后绑定,父页无法直接监听子页按键,必须由子页自身监听后通过parent或postMessage通知父页。典型写法为子页调用父页已定义的关闭函数。需注意焦点状态、输入法及layui版本兼容性等陷阱。
时间:2026-07-06 07:02
Layui表单提交时携带当前页面Meta信息的实现方法
Layui表单提交不会自动携带页面Meta信息,需在form on( submit )回调中手动读取meta内容并拼接到表单数据,注意后端字段映射及特殊字符编码,多meta时按需选取。
时间:2026-07-06 07:00
HTML5拖拽事件流状态转移监控调试
HTML5拖拽事件流易因漏监听或未调用preventDefault而中断。需掌握dragstart设置数据、dragover接受放置、drop触发条件等关键点。通过统一日志捕获事件上下文、识别常见状态丢失场景并配合可视化面板,可清晰定位拖拽过程断点。
时间:2026-07-06 07:00
uni-app实现小红书商品详情图卡片切换
通过手写touch事件与transform控制五张卡片,动态计算translateX、scale、opacity及z-index模拟层叠滑动效果。滑动距离超过80rpx触发切换,否则复位。图片仅渲染当前及前后两张,有效优化加载性能与渲染效率。
时间:2026-07-06 07:00
图像旋转倾斜与扭曲的Canvas像素矩阵变换
Canvas图像变形本质是操作坐标系,图像被动跟随。旋转需先平移原点至目标中心再旋转后复位;倾斜通过仿射变换矩阵实现;扭曲无原生API,可用分块模拟或转用WebGL。每次变换前保存状态,完成后恢复,避免坐标系偏移。
时间:2026-07-06 07:00
- 日榜
- 周榜
- 月榜
相关攻略
2026-07-06 07:02
2026-07-06 07:00
2026-07-06 07:00
2026-07-06 07:00
2026-07-06 07:00
2026-07-06 07:00
2026-07-06 06:59
2026-07-06 06:59
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
梦之形手机版阿鬼角色技能解析与实战表现
发布于 2026-07-06
红色沙漠暗影主宰成就完成攻略
发布于 2026-07-06
Garden-in新滤镜成就解锁攻略
发布于 2026-07-06
王者荣耀世界光追开启位置指南
发布于 2026-07-06
我要当老祖限时首领高伤打法技巧攻略
发布于 2026-07-06
龙腾世纪3审判物品复制方法轻松获取珍稀装备
发布于 2026-07-06
玩转游戏法则,轻松掌握核心技巧与策略
发布于 2026-07-06
龙腾世纪3审判捏脸技巧打造惊艳女性角色
发布于 2026-07-06
Win11频繁断网提示默认网关不可用怎么办
发布于 2026-07-03
Mac如何取消正在进行的系统备份任务
发布于 2026-07-03
电脑显示器刷新率锁死60Hz无法调整的解决方法
发布于 2026-07-03
Linux系统下Systemd服务管理从零开始方法步骤详解完整教程
发布于 2026-07-03
雅迪电动车各型号电量显示图超详细解析
发布于 2026-07-06
内存卡在电脑上显示未格式化的解决方法
发布于 2026-07-06
惠普笔记本重启后如何顺利进入BIOS设置
发布于 2026-07-06
小天鹅洗衣机童锁误开快速关闭教程
发布于 2026-07-06
热门话题

