扩展具有深层嵌套属性的对象
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)
我有一个嵌套的默认对象,我想用嵌套属性扩展和覆盖它。我尝试使用传播运算符,但您也可以使用 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)