如何用ES6数组方法检测对象数组重复并实现对象按需添加?
嘿,我懂你遇到的痛点了——简单数组用filter结合indexOf的去重方法,到对象数组这儿就失效了,毕竟对象是引用类型,indexOf只能判断是不是同一个引用,没法识别内容相同但引用不同的对象。针对你要的「按id判断,不存在才添加」的需求,给你几个实用的解决方案:
1. 最直接的:先检查再添加
这完全贴合你的场景,逻辑清晰,容易理解:
// 你的原始对象数组 const objArray = [{id:1},{id:2},{id:3}]; // 准备添加的目标对象 const targetObj = {id:1}; // 用some()检查数组中是否存在相同id的对象 const isDuplicate = objArray.some(item => item.id === targetObj.id); if (!isDuplicate) { objArray.push(targetObj); console.log("对象已成功添加"); } else { console.error("错误:该id对应的对象已经存在啦"); }
这里some()方法会遍历数组,只要找到一个id匹配的元素就返回true,能快速完成存在性检查,性能也不错。
2. 封装成可复用函数
如果需要多次执行这个添加操作,把逻辑封装成函数会更方便:
function addUniqueObject(arr, newObj) { const exists = arr.some(item => item.id === newObj.id); if (!exists) { arr.push(newObj); return { success: true, msg: "添加成功" }; } else { return { success: false, msg: `id为${newObj.id}的对象已存在` }; } } // 调用示例 const objArray = [{id:1},{id:2},{id:3}]; // 添加新对象 const res1 = addUniqueObject(objArray, {id:4}); console.log(res1); // { success: true, msg: "添加成功" } // 尝试添加重复对象 const res2 = addUniqueObject(objArray, {id:1}); console.error(res2.msg); // 错误:id为1的对象已存在
3. 批量去重(类似你原来的filter用法)
要是你手里有一个包含重复id的对象数组,想直接得到去重后的结果,可以用Map来实现(比嵌套遍历高效得多):
const duplicateObjArray = [{id:1},{id:2},{id:2},{id:3},{id:1}]; // 利用Map的键唯一性去重,保留每个id最后出现的对象 const uniqueObjArray = Array.from( new Map(duplicateObjArray.map(item => [item.id, item])).values() ); console.log(uniqueObjArray); // [{id:1},{id:2},{id:3}]
原理是把数组转成以id为键、对象为值的Map,Map会自动覆盖重复键对应的对象,最后再把Map的值转回数组就得到了去重结果。
小提示
如果你的判断条件不是单一的id,而是多个属性的组合,只需要修改判断逻辑就行,比如:
// 同时检查name和age是否都相同 const isDuplicate = objArray.some(item => item.name === newObj.name && item.age === newObj.age);
内容的提问来源于stack exchange,提问作者krv
相关产品推荐
相关产品推荐

