
本文介绍如何在 javascript 中对对象数组进行智能去重:当多个对象具有相同 lineid 时,保留 status 为 "submitted" 的项,舍弃同 lineid 下 status 为 "new" 的重复项。
本文介绍如何在 javascript 中对对象数组进行智能去重:当多个对象具有相同 lineid 时,保留 status 为 "submitted" 的项,舍弃同 lineid 下 status 为 "new" 的重复项。
在实际业务开发中(如表单提交、工单状态管理),我们常遇到一类「带优先级的去重」需求:同一业务实体(由 lineId 标识)可能多次更新,产生多个状态记录(如 "New" 和 "Submitted"),而我们只希望保留最新/更高级别的状态,同时彻底剔除低优先级的冗余项。
本例的核心规则是:每个 lineId 最多保留一项;若存在 "Submitted" 状态,则必须选它;仅当该 lineId 全部为 "New" 时,才保留其任意一项(但本例数据中无此情况)。
✅ 推荐解法:reduce() + 对象哈希映射(简洁高效)
利用 reduce() 遍历数组,以 lineId 为键构建临时哈希表,并在每次遇到同 lineId 时按优先级决定是否更新:
const response = [
{ line: "Line 2", lineId: "R_X002_WC02", status: "New" },
{ line: "Line 3", lineId: "R_X002_WC03", status: "New" },
{ line: "Line 2", lineId: "R_X002_WC02", status: "Submitted" },
{ line: "Line 4", lineId: "R_X002_WC04", status: "New" },
{ line: "Line 4", lineId: "R_X002_WC04", status: "Submitted" }
];
const uniqueResponse = response.reduce((acc, item) => {
// 若 acc 中尚无该 lineId,或当前项 status 是 "Submitted"(更高优先级),则覆盖
if (!acc[item.lineId] || item.status === "Submitted") {
acc[item.lineId] = item;
}
return acc;
}, {});
const result = Object.values(uniqueResponse);
console.log(result);
// 输出:
// [
// { line: "Line 2", lineId: "R_X002_WC02", status: "Submitted" },
// { line: "Line 3", lineId: "R_X002_WC03", status: "New" },
// { line: "Line 4", lineId: "R_X002_WC04", status: "Submitted" }
// ]? 关键逻辑说明
- acc 是一个以 lineId 为 key 的普通对象(即哈希映射),用于快速查重;
- 条件 !acc[item.lineId] 确保首次出现的 lineId 必然被收录;
- 条件 item.status === "Submitted" 保证:一旦后续遇到同 lineId 且 status 更优的项,就将其覆盖原值;
- 最终用 Object.values() 提取所有保留项,得到纯净数组。
⚠️ 注意事项与扩展建议
- 优先级可配置化:若未来需支持更多状态(如 "Approved" > "Submitted" > "New"),建议将状态映射为数字权重(如 { New: 1, Submitted: 2, Approved: 3 }),改用 item.priority > acc[item.lineId]?.priority 判断;
- 避免副作用:本方案不修改原始数组,符合函数式编程原则;
- 性能表现:时间复杂度 O(n),空间复杂度 O(k)(k 为唯一 lineId 数量),远优于嵌套循环(O(n²));
- 兼容性:适用于所有现代浏览器及 Node.js 环境(ES5+);
- 空值防护:生产环境建议增加 item && item.lineId && typeof item.lineId === 'string' 校验,防止运行时错误。
通过这一模式,你不仅能精准解决当前 "New"/"Submitted" 的去重问题,还能轻松适配各类基于字段优先级的数据清洗场景。

















