JavaScript中如何判断两个JSON数组是否存在相同对象元素
问题根因
JavaScript 中的 includes() 方法对对象这类引用类型是按内存引用地址比对的,而非按对象的内容值匹配。即使两个对象的字段、取值完全一致,只要是不同的实例,includes() 都会判定为不相等,这就是你的代码对基础类型数组有效、对对象数组失效的原因。
解决方案
方案1:指定字段比对(性能最优,适配你的需求场景)
你的需求只需要校验name和year两个字段是否匹配,直接双重遍历比对指定字段即可:
const found_prod_and_year = json1.some(item1 => { return json2.some(item2 => item1.name === item2.name && item1.year === item2.year) })
最终返回的布尔值就是你需要的结果:存在任意匹配项返回true,无匹配返回false。
方案2:全字段通用比对(适合字段不固定的场景)
如果需要比对对象的所有字段,可以先将对象序列化为JSON字符串后再做匹配,为了提升性能可以先把第二组数据的序列化结果存入Set:
const json2StrSet = new Set(json2.map(item => JSON.stringify(item))) const found_prod_and_year = json1.some(item => json2StrSet.has(JSON.stringify(item)))
注意该方案存在限制:如果对象中包含函数、undefined、Symbol这类JSON序列化会丢失的属性,该方法不适用,需手动编写全量字段比对逻辑或使用深比较工具函数。
内容的提问来源于stack exchange,提问作者Wylliam M
相关产品推荐
相关产品推荐

