Set添加重复对象问题:如何高效避免重复插入对象?
如何高效向Set中添加对象并避免重复
JavaScript的Set是通过**严格相等(===)**判断元素是否重复的。对于对象这类引用类型,即使两个对象的键值完全一致,它们也是不同的内存引用,因此Set会将它们视为独立元素,无法自动去重。
下面提供几种高效的解决方法:
方案1:利用对象的唯一标识维护去重
如果你的对象存在唯一标识(比如org_name),这是最高效的方式,直接用唯一标识作为Set的元素来检测重复:
// 用Set存储唯一标识,避免重复 const orgIds = new Set(); // 存储去重后的对象数组 const uniqueOrgs = []; const addOrg = (orgObj) => { if (!orgIds.has(orgObj.org_name)) { orgIds.add(orgObj.org_name); uniqueOrgs.push(orgObj); } }; // 调用添加 addOrg({ org_name: org.org_name, relation_type: OrganisationRelationType.SELF, related_org: org.org_name }); addOrg({ org_name: org.org_name, relation_type: OrganisationRelationType.SELF, related_org: org.org_name }); // 最终uniqueOrgs中仅保留一个对象
方案2:序列化对象为字符串(全字段匹配)
如果需要基于对象的所有字段判断重复,且对象没有不可序列化的内容(比如函数、Symbol),可以将对象序列化为字符串存入Set:
const orgStrSet = new Set(); const obj1 = { org_name: org.org_name, relation_type: OrganisationRelationType.SELF, related_org: org.org_name }; const obj2 = { org_name: org.org_name, relation_type: OrganisationRelationType.SELF, related_org: org.org_name }; orgStrSet.add(JSON.stringify(obj1)); orgStrSet.add(JSON.stringify(obj2)); // 还原为对象数组 const uniqueOrgs = Array.from(orgStrSet).map(str => JSON.parse(str));
注意:如果对象的属性顺序不同,JSON.stringify的结果会不一样,可能导致误判;同时无法处理不可序列化的属性。
方案3:自定义哈希值(多字段组合判断)
如果需要多个字段组合起来判断唯一性,可以手动生成唯一哈希字符串:
const orgHashSet = new Set(); // 根据关键字段生成唯一哈希 const generateOrgHash = (orgObj) => { return `${orgObj.org_name}-${orgObj.relation_type}-${orgObj.related_org}`; }; const addUniqueOrg = (orgObj) => { const hash = generateOrgHash(orgObj); if (!orgHashSet.has(hash)) { orgHashSet.add(hash); // 如果需要保留对象,可用Map存储:const orgMap = new Map(); orgMap.set(hash, orgObj); } }; // 调用添加 addUniqueOrg({ org_name: org.org_name, relation_type: OrganisationRelationType.SELF, related_org: org.org_name }); addUniqueOrg({ org_name: org.org_name, relation_type: OrganisationRelationType.SELF, related_org: org.org_name });
这种方法灵活,适合多字段联合判断的场景,需确保哈希生成逻辑能唯一标识对象。
内容的提问来源于stack exchange,提问作者user11284763
相关产品推荐
相关产品推荐

