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
相关产品推荐
相关产品推荐

