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

如何让目标嵌套对象仅保留与源对象共有的键?

如何让嵌套对象仅保留另一个对象存在的键(包含嵌套层级)

你遇到的是嵌套对象的键过滤问题,核心是要递归地遍历两个对象的结构,只保留targetKeys中在sourceKeys里存在的键(不管层级多深)。下面是具体的实现方案:

先回顾你的示例数据:

const sourceKeys = {
  school: {
    name: "Elisa Lemonnier",
    students: 250
  },
  house: {
    room : 2,
    kids: true,
    assets: "elevator",
  }
}
const targetKeys = {
  school: {
    name: "Lucie Faure",
    students: 150,
    address: "123 Main St.",
    phone: "555-555-5555"
  },
   house: {
    room : 4,
    kids: false,
    assets: "Garden",
    shop: "Auchan"
  }
}

我们可以写一个递归函数来处理这个逻辑:

function filterNestedObject(target, source) {
  // 处理非对象或null的边界情况,直接返回目标值
  if (typeof target !== 'object' || target === null || typeof source !== 'object' || source === null) {
    return target;
  }

  // 创建新对象存储过滤结果,避免修改原对象
  const result = {};

  // 遍历源对象的所有键,只保留目标对象中存在的键
  Object.keys(source).forEach(key => {
    if (key in target) {
      // 递归处理嵌套的对象结构
      result[key] = filterNestedObject(target[key], source[key]);
    }
  });

  return result;
}

// 调用函数得到期望结果
const targetKeysMatchingSourceKeys = filterNestedObject(targetKeys, sourceKeys);
console.log(targetKeysMatchingSourceKeys);

运行后就能得到你想要的结果:

{
  school: {
    name: "Lucie Faure",
    students: 150,
  },
   house: {
    room : 4,
    kids: false,
    assets: "Garden",
  }
}

代码逻辑说明:

  • 递归遍历:函数会逐层检查对象结构,遇到嵌套对象时自动递归处理,确保所有层级的键都能被正确过滤。
  • 边界防护:针对非对象类型(比如字符串、数字)或null值直接返回,避免无效遍历。
  • 数据不可变:全程创建新对象存储结果,不会修改原始的sourceKeys和targetKeys,保证原数据的完整性。

如果后续需要处理嵌套数组的场景,只需在函数中增加数组类型的判断和遍历逻辑即可,当前版本已经完全适配你给出的示例需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 18:15:37