【问题标题】: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)