如何让目标嵌套对象仅保留与源对象共有的键?
如何让嵌套对象仅保留另一个对象存在的键(包含嵌套层级)
你遇到的是嵌套对象的键过滤问题,核心是要递归地遍历两个对象的结构,只保留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
相关产品推荐
相关产品推荐

