JavaScript中如何筛选两个对象共有的键值对(支持嵌套对象场景)
嵌套对象共有键值对筛选实现
原代码问题分析
你之前的代码仅支持平面对象的公共键值对筛选,存在两个核心问题:
- 嵌套对象用
==比较时,对比的是对象的内存引用地址而非实际内容,所以永远会返回false,导致嵌套场景无结果 - 双重循环遍历两个对象的键判断相等,逻辑冗余效率低
实现方案
我们可以通过递归处理嵌套对象,逐层校验公共键值对,代码实现如下:
function getCommonKeyValue(obj1, obj2) { const result = {} // 遍历第一个对象的所有自有键 for (const key of Object.keys(obj1)) { // 第二个对象不存在当前键直接跳过 if (!obj2.hasOwnProperty(key)) continue const val1 = obj1[key] const val2 = obj2[key] // 两个值都是非null对象时,递归处理嵌套结构 if (typeof val1 === 'object' && val1 !== null && typeof val2 === 'object' && val2 !== null) { const nestedRes = getCommonKeyValue(val1, val2) // 嵌套层存在公共键值对才写入结果,避免空对象残留 if (Object.keys(nestedRes).length) { result[key] = nestedRes } } else { // 基础类型直接对比值相等即写入 if (val1 === val2) { result[key] = val1 } } } return result }
效果测试
平面对象测试
const first1 = {a:3 , b:4} const second1 = {a:5 , b:4} console.log(getCommonKeyValue(first1, second1)) // 输出:{b: 4}
嵌套对象测试
const first2 = {a: 3, b: {x:7}} const second2 = {a: 4, b: {x: 7, y: 10}} console.log(getCommonKeyValue(first2, second2)) // 输出:{b: {x: 7}}
注意事项
- 用
hasOwnProperty过滤原型链继承的键,避免非自有键干扰结果 - 新增
val !== null判断,规避typeof null === 'object'的JS历史遗留问题 - 嵌套递归结果先判空再写入,不会出现无意义的空对象字段
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

