
本文介绍如何基于指定属性(如 name)将数组精准拆分为两个子数组——一个包含所有重复项(即该属性值出现多次的所有对象),另一个仅含完全唯一的项,适用于数据清洗与校验场景。
本文介绍如何基于指定属性(如 name)将数组精准拆分为两个子数组——一个包含所有重复项(即该属性值出现多次的所有对象),另一个仅含完全唯一的项,适用于数据清洗与校验场景。
在实际前端开发中,尤其是处理用户导入的结构化数据(如客户列表、商品清单)时,常需识别并隔离重复记录——不是简单去重,而是明确区分“哪些是重复的”和“哪些是真正唯一的”,以便后续人工审核或差异化处理。例如,当多个客户共享相同姓名但 ID 或地址不同时,系统应将全部同名记录归入“待确认重复集”,而将姓名完全无冲突的记录送入主业务流程。
以下是一个健壮、可复用的解决方案,使用 Map 按指定键(如 name)聚合同名对象,再依据分组长度严格划分:
/**
* 将数组按指定属性拆分为重复项数组和唯一项数组
* @param {Array} arr - 原始对象数组
* @param {string} key - 用于判断重复的属性名(如 'name')
* @returns {{duplicates: Array, uniques: Array}} 包含两个数组的对象
*/
function splitByDuplicates(arr, key) {
const groupMap = new Map();
// 第一步:按 key 聚合所有对象
for (const item of arr) {
const keyValue = item[key];
if (!groupMap.has(keyValue)) {
groupMap.set(keyValue, []);
}
groupMap.get(keyValue).push(item);
}
const duplicates = [];
const uniques = [];
// 第二步:按分组长度分配到对应数组
for (const group of groupMap.values()) {
if (group.length > 1) {
duplicates.push(...group); // 所有同 key 的项均视为重复成员
} else {
uniques.push(...group);
}
}
return { duplicates, uniques };
}
// 使用示例
const customers = [
{ id: 1, name: "John", address: "123 street" },
{ id: 2, name: "Alex", address: "456 street" },
{ id: 3, name: "John", address: "674 street" },
{ id: 4, name: "Stacy", address: "534 street" },
{ id: 5, name: "Blair", address: "634 street" }
];
const { duplicates, uniques } = splitByDuplicates(customers, 'name');
console.log("重复项(需人工校验):", duplicates);
// → [{ id:1, name:"John", ... }, { id:3, name:"John", ... }]
console.log("唯一项(可直接处理):", uniques);
// → [{ id:2, name:"Alex", ... }, { id:4, name:"Stacy", ... }, { id:5, name:"Blair", ... }]✅ 关键优势说明:
- 语义清晰:duplicates 包含 所有 出现在重复组中的元素(不止“第二个以后”的项),确保无遗漏;
- 性能可靠:时间复杂度 O(n),仅遍历两次,Map 查找为 O(1),远优于嵌套循环;
- 灵活可扩展:只需修改 key 参数即可适配任意字段(如 email、phone);
- 强类型友好:函数签名明确,便于 TypeScript 类型推导(可补充泛型定义)。
⚠️ 注意事项:
立即学习“Java免费学习笔记(深入)”;
- 若 key 对应值为 undefined 或 null,会被统一归为同一组——建议预处理确保字段存在,或添加空值校验逻辑;
- 本方案不修改原数组,返回全新数组,符合函数式编程原则;
- 如需保留原始顺序(例如重复组内按首次出现排序),当前实现已天然满足(Map 迭代顺序与插入顺序一致)。
该方法已在表单校验、Excel 导入去重、CRM 数据合并等真实场景中验证有效,兼顾准确性、可读性与工程实践性。










