JavaScript 中两个深层对象的交集

chr*_*ndy 5 javascript nested object javascript-objects

我有两个 JavaScript 对象(任意深度),它们具有许多相同的信息。

我正在寻求帮助获取两个对象之间的共享数据

例如:

const a = {
  name: 'Alice',
  features: {
    speed: 3,
    strength: 90,
    mind: {
      power: 42
    }
  }
};

const b = {
  name: 'Bob',
  features: {
    speed: 3,
    stamina: 1,
    mind: {
      power: 42,
      flexibility: 0,
      telekinesis: 42
    }
  }
};
Run Code Online (Sandbox Code Playgroud)

我的目标是提出一个解决方案来生成他们共享的数据:

const shared = {
  features: {
    speed: 3,
    mind: {
      power: 42
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在操作的真实数据是任意深度嵌套的(通常是对象内的数十个对象),但我希望上面的示例有所帮助。

这是一项一次性任务,因此我并不特别关心性能,并且只要它可以工作,我很乐意使用任何库。谢谢您的帮助!

chr*_*ndy 1

当对象值为 时,该线程中的其他答案似乎崩溃了undefined,因此我结合了每个答案的最佳部分,得出了一个可靠的解决方案:

const isObj = x => typeof x === 'object'

const common = (a, b) => {
  let result = {}

  if (([a, b]).every(isObj)) {
    Object.keys(a).forEach((key) => {
      const value = a[key]
      const other = b[key]

      if (isObj(value)) {
        result[key] = common(value, other)
      } else if (value === other) {
        result[key] = value
      }
    })
  }

  return result
}
Run Code Online (Sandbox Code Playgroud)