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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 03:45:03