如何在JavaScript中获取一个对象有但另一个对象没有的键
提取仅存在于obj1中的嵌套键
先看给定的两个对象:
const obj1 = { a: 5, e: { c: 10, l: { b: 50, }, }, }; const obj2 = { a: 5, e: { c: 10, }, };
需求是获取仅在obj1中存在的所有层级的键,可以返回扁平化的键名数组(如['l', 'b']),或者带完整层级路径的数组(如['e.l', 'e.l.b']),以下是两种实现方案:
方案1:返回扁平化的键名数组
这个方案只收集键名,不保留层级路径:
function getUniqueKeys(obj1, obj2) { const uniqueKeys = []; function traverse(currentObj, currentObj2) { for (const key of Object.keys(currentObj)) { if (!(key in currentObj2)) { uniqueKeys.push(key); } else { const val1 = currentObj[key]; const val2 = currentObj2[key]; // 仅当两者都是非null对象时才递归 if (typeof val1 === 'object' && val1 !== null && typeof val2 === 'object' && val2 !== null) { traverse(val1, val2); } } } } traverse(obj1, obj2); return uniqueKeys; } // 调用后输出 ['l', 'b'] console.log(getUniqueKeys(obj1, obj2));
方案2:返回带层级路径的键数组
如果需要明确知道键所在的嵌套层级,可以用这个方案,返回带完整路径的键:
function getUniqueKeysWithPath(obj1, obj2, parentPath = '') { const uniqueKeys = []; function traverse(currentObj, currentObj2, path) { for (const key of Object.keys(currentObj)) { const fullPath = path ? `${path}.${key}` : key; if (!(key in currentObj2)) { uniqueKeys.push(fullPath); } else { const val1 = currentObj[key]; const val2 = currentObj2[key]; if (typeof val1 === 'object' && val1 !== null && typeof val2 === 'object' && val2 !== null) { traverse(val1, val2, fullPath); } } } } traverse(obj1, obj2, parentPath); return uniqueKeys; } // 调用后输出 ['e.l', 'e.l.b'] console.log(getUniqueKeysWithPath(obj1, obj2));
实现思路
核心是通过递归遍历对象的每一层:
- 遍历当前obj1的所有键,检查obj2的对应层级是否存在该键
- 若不存在,直接加入结果数组
- 若存在且两者都是非null的对象,则继续递归遍历嵌套的子对象,直到所有层级处理完毕
内容的提问来源于stack exchange,提问作者Slava
相关产品推荐
相关产品推荐

