【问题标题】:Extend object with deep nested properties [duplicate]扩展具有深层嵌套属性的对象[重复]
【发布时间】:2020-11-21 03:13:25
【问题描述】:

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

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

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 年 8 月 24 日更新

似乎这个问题与另一个问题重复,因此我将其删除。

【问题讨论】:

    标签: javascript object properties extend


    【解决方案1】:

    这是一个递归解决方案,尽管它会改变输入对象并且不会返回一个新对象,正如我想要的那样。因此我添加了 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)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-08
      • 1970-01-01
      • 2021-04-14
      • 1970-01-01
      • 2020-04-13
      相关资源
      最近更新 更多