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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 10:36:29