本文介绍一种基于 Array.reduce() 和哈希映射的高效过滤策略:对具有相同 id 的对象,当存在 "HD" 和 "SD" 类型时,自动保留 "HD" 版本,剔除 "SD" 版本,最终返回每个 ID 对应的最优记录。
本文介绍一种基于 `array.reduce()` 和哈希映射的高效过滤策略:对具有相同 `id` 的对象,当存在 `"hd"` 和 `"sd"` 类型时,自动保留 `"hd"` 版本,剔除 `"sd"` 版本,最终返回每个 id 对应的最优记录。
在处理结构化数据(如视频资源列表)时,常遇到同一资源 ID 对应多个质量版本(如 "HD" 和 "SD"),而业务逻辑要求每个 ID 仅保留最高优先级类型(如 "HD")。此时简单去重(如仅按 id 保留首个)不可靠,需引入优先级判断。
推荐使用 Array.prototype.reduce() 构建以 id 为键的对象映射(即哈希表),并在迭代中动态决策是否更新该 id 对应的值:
const arr = [ { id: "123", type: "HD" }, { id: "123", type: "SD" }, { id: "1234", type: "HD" }, { id: "12", type: "SD" }];const filtered = Object.values( arr.reduce((map, item) => { // 若该 id 尚未存在,或已存在但当前不是 "HD",则用当前项覆盖(优先保留 HD) if (!map[item.id] || map[item.id].type !== "HD") { map[item.id] = item; } return map; }, {}));console.log(filtered);// 输出:// [// { id: "123", type: "HD" },// { id: "1234", type: "HD" },// { id: "12", type: "SD" }// ]
✅ 关键逻辑说明:
⚠️ 注意事项:
该方法简洁、可读性强,且易于维护和扩展,适用于各类“按键聚合 + 优先级筛选”场景。