扩展具有深层嵌套属性的对象

Extend object with deep nested properties

我有一个嵌套的默认对象,我想用嵌套属性扩展和覆盖它。我尝试使用传播运算符,但您也可以使用 Ojbect.assign.

问题是嵌套对象被覆盖,而不是它们各自的属性被覆盖 and/or 扩展。

const defaultOptions = {
  a: 0,
  b: 1,
  c: {
    hello: 'world',
    age: 20
  }
};

const specialOptions = {
  b: 0,
  c: {
    age: 10
  },
  d: 1
};

const options = {
  ...defaultOptions,
  ...specialOptions
}
console.log(options)


const expectedOptions = {
  a: 0,
  b: 0,
  c: {
    hello: 'world',
    age: 10
  },
  d: 1
}
console.log(expectedOptions)

2021-08-24更新

看来这个问题与另一个问题重复,所以我会删除它。

这是一个递归解决方案,尽管它改变了输入对象并且没有 return 一个新的,正如我想要的那样。因此我添加了 deepCopy 函数。

此外,订单未维护。但我认为,如果您一开始就使用对象,那不是最关心的问题。

const defaultOptions = {
  a: 0,
  b: 1,
  c: {
    hello: 'world',
    age: 20
  }
}
const specialOptions = {
  b: 0,
  c: {
    age: 10
  },
  d: 1
}

const deepCopy = obj => JSON.parse(JSON.stringify(obj))

const options = deepCopy(specialOptions)

const extendObj = (defaults, obj) => {
  Object.entries(defaults)
    .forEach(([key, value]) => {
      if (obj[key] === undefined) {
        obj[key] = value
      } else if (typeof value === 'object') {
        extendObj(defaults[key], obj[key])
      }
    })
}

extendObj(defaultOptions, options)
console.log(options)