JavaScript中两个对象数组查重、合并去重及重复项提取问题求助
问题原因
你现有代码直接用item.id !== array2.id做判断逻辑错误:array2是数组类型,本身不存在id属性,该判断永远返回true,无法实现去重和筛选重复项的效果。
修正后代码
let array1 = [ { id: 1, name: "Oliver" }, { id: 2, name: "Liam" }, ]; let array2 = [ { id: 1, name: "Oliver" }, { id: 3, name: "James" }, { id: 4, name: "Lucas" }, ]; // 存储array1的所有id,用于快速校验重复 const array1IdSet = new Set(array1.map(item => item.id)); const duplicateNames = []; const array2UniqueItems = []; array2.forEach(item => { if (array1IdSet.has(item.id)) { // 收集重复项的名称 duplicateNames.push(item.name); } else { // 收集array2中独有的新增项 array2UniqueItems.push(item); } }) // 合并得到去重后的完整数组 const newContact = [...array1, ...array2UniqueItems]; console.log("newContact :", newContact); console.log("duplicateContacts:", duplicateNames.join(','));
实现逻辑
- 用
Set存储array1的id,判断重复的时间复杂度为O(1),比遍历数组判断效率更高 - 遍历array2区分重复项和新增项,重复项收集名称,新增项单独存储
- 合并array1和array2的新增项,得到无重复的合并数组
- 最终输出结果和预期完全一致
内容的提问来源于stack exchange,提问作者Good
相关产品推荐
相关产品推荐

