一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何根据 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²) 方案。

该方法简洁、可读性强,且易于维护和扩展,适用于各类“按键聚合 + 优先级筛选”场景。

热门栏目