You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript中如何查找两个不同数组中包含的相同对象

JavaScript两个对象数组取公共元素的实现方法

首先要注意:JavaScript中对象为引用类型,直接用===对比时,只有两个变量指向同一块内存地址才会返回true,你可以根据实际场景选择对应实现方案:


场景1:两个数组中的公共对象为同一引用

即你示例里array1的{obj1}和array2的{obj1}指向同一个内存地址,可直接用以下方法实现:

let array1 = [obj1, obj2, obj3]
let array2 = [obj1, obj4, obj5]

// 数组长度较小时的简单实现
const commonItems = array1.filter(item => array2.includes(item))

// 数组长度较大时,用Set优化查找性能,时间复杂度从O(n²)降到O(n)
const array2Set = new Set(array2)
const commonItems = array1.filter(item => array2Set.has(item))

最终commonItems数组中就包含你需要的公共对象obj1。


场景2:两个数组中的公共对象仅内容相同、引用不同

即两个obj1的属性值完全一致,但属于不同的实例,没有指向同一块内存地址,此时需要按属性匹配来筛选:

方案A:按唯一标识字段匹配(性能最优,推荐)

如果对象有id这类全局唯一的字段,可基于唯一字段筛选:

let array1 = [{id:1, name:'obj1'}, {id:2, name:'obj2'}, {id:3, name:'obj3'}]
let array2 = [{id:1, name:'obj1'}, {id:4, name:'obj4'}, {id:5, name:'obj5'}]

// 先提取第二个数组的所有唯一id存入Set
const array2UniqueIds = new Set(array2.map(item => item.id))
// 过滤出第一个数组中id匹配的项
const commonItems = array1.filter(item => array2UniqueIds.has(item.id))

方案B:全属性匹配

如果没有唯一标识,需要对比对象的所有属性,可通过序列化字符串对比(注意该方案要求对象属性顺序一致,且不能包含函数、Symbol等无法序列化的属性):

const array2StrSet = new Set(array2.map(item => JSON.stringify(item)))
const commonItems = array1.filter(item => array2StrSet.has(JSON.stringify(item)))

内容的提问来源于stack exchange,提问作者salman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 02:18:02