最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
如何根据 ID 去重并优先保留 type 为 HD 的对象
时间:2026-06-18 09:39:58 编辑:袖梨 来源:一聚教程网
本文介绍一种基于 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" }// ]
✅ 关键逻辑说明:
- 初始 map 是一个空对象,item.id 作为键;
- 条件 !map[item.id] || map[item.id].type !== "HD" 确保:
- 首次遇到某 id → 必然写入;
- 已存在且原 type 不是 "HD" → 新项(即使是 "HD")将覆盖;
- 已存在且原 type 是 "HD" → 新项(如 "SD")被忽略,保持 "HD" 不变。
⚠️ 注意事项:
- 此方案假设 "HD" 为最高优先级;若需扩展多级优先(如 "UHD" > "HD" > "SD"),可改用预定义优先级映射(如 { UHD: 3, HD: 2, SD: 1 })比较数值;
- Object.values() 返回顺序与插入顺序一致(ES2015+ 保证),但不依赖原始数组顺序;如需严格保持首次 "HD" 出现位置,可额外记录索引;
- 时间复杂度为 O(n),空间复杂度 O(k)(k 为唯一 ID 数量),优于嵌套 filter/findIndex 的 O(n²) 方案。
该方法简洁、可读性强,且易于维护和扩展,适用于各类“按键聚合 + 优先级筛选”场景。
相关文章
- 小鹅通网页版登录入口地址-小鹅通网页版商家学员登录入口地址分享 07-11
- 如何校正Octane偏黄色调 07-11
- 微信流量统计查询流程 07-11
- 华硕路由器流量统计查看办法 07-11
- 蚂蚁庄园最新答案鸬鹚 2026年7月3日最新蚂蚁庄园答案 07-11
- 美团优选暂停营业原因为何 07-11