当前位置: 首页
前端开发
对象按分类值分组并生成带变体数组的方法

对象按分类值分组并生成带变体数组的方法

热心网友 时间:2026-06-25
转载
在日常前端开发中,我们经常需要处理一类常见需求:手头有一组扁平化数据,例如商品列表,希望按照品类进行聚合——将同一品类的所有商品挂载到该品类第一个出现的商品之下,形成“主商品 + 变体”的层级结构。如果某个品类只有一件商品,则将其变体字段设为 `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弹出层监听子页面键盘快捷键实现方法

Layui弹出层监听子页面键盘快捷键实现方法

子页面键盘事件监听需在DOM加载完成后绑定,父页无法直接监听子页按键,必须由子页自身监听后通过parent或postMessage通知父页。典型写法为子页调用父页已定义的关闭函数。需注意焦点状态、输入法及layui版本兼容性等陷阱。

时间:2026-07-06 07:02
Layui表单提交时携带当前页面Meta信息的实现方法

Layui表单提交时携带当前页面Meta信息的实现方法

Layui表单提交不会自动携带页面Meta信息,需在form on( submit )回调中手动读取meta内容并拼接到表单数据,注意后端字段映射及特殊字符编码,多meta时按需选取。

时间:2026-07-06 07:00
HTML5拖拽事件流状态转移监控调试

HTML5拖拽事件流状态转移监控调试

HTML5拖拽事件流易因漏监听或未调用preventDefault而中断。需掌握dragstart设置数据、dragover接受放置、drop触发条件等关键点。通过统一日志捕获事件上下文、识别常见状态丢失场景并配合可视化面板,可清晰定位拖拽过程断点。

时间:2026-07-06 07:00
uni-app实现小红书商品详情图卡片切换

uni-app实现小红书商品详情图卡片切换

通过手写touch事件与transform控制五张卡片,动态计算translateX、scale、opacity及z-index模拟层叠滑动效果。滑动距离超过80rpx触发切换,否则复位。图片仅渲染当前及前后两张,有效优化加载性能与渲染效率。

时间:2026-07-06 07:00
图像旋转倾斜与扭曲的Canvas像素矩阵变换

图像旋转倾斜与扭曲的Canvas像素矩阵变换

Canvas图像变形本质是操作坐标系,图像被动跟随。旋转需先平移原点至目标中心再旋转后复位;倾斜通过仿射变换矩阵实现;扭曲无原生API,可用分块模拟或转用WebGL。每次变换前保存状态,完成后恢复,避免坐标系偏移。

时间:2026-07-06 07:00
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜