JS 递归对象赋值
JS Recursive object assign
我了解到,在使用 Object.assign() 时,它仅扩展顶级对象。如何深入扩展对象?例如,假设我有以下源对象:
const source = {
id: 1,
otherKey: {},
params: {
page: {
a: 1,
b: {}
},
data: {
b: 1
}
}
}
我正在这样使用 Object.assign()
:
Object.assign({}, source, {
params: {
page: {
a: 2
}
}
}
结果将是:
{
id: 1,
otherKey: {},
params: {
page: {
a: 2
}
}
}
如何以浅克隆方式保留 params.data 键和 params.page.b 键。
oldObject.params.data === newObject.params.data // true
oldObject.params.page === newObject.params.page // false
oldObject.params.page.b === newObject.params.page.b // true
注:本题与How to deep merge instead of shallow merge不一样。那里的答案没有给出预期的结果。
检查这个 bin,它从上面 link 中得到答案。
所以在您发布的代码中,如果源和目标都包含相同的密钥,那么什么也不会发生。该对象向下递归给子对象。但是,如果您只是将内部块更改为:
if (!target[key]) {
Object.assign(target, { [key]: {} });
}else{
target[key] = Object.assign({}, target[key])
}
mergeDeep(target[key], source[key]);
这将为在源和目标中找到的任何键创建一个新的分配对象。有趣的是,如果您这样做,您预期的 falseys
将不会出现在控制台中。这是因为目标将 总是 匹配结果,因为它是最终的变异对象。因此,为了获得预期的 false
结果,您需要执行以下操作:
var tester = source.params
const result = mergeDeep(source, b)
console.log(tester === result.params) // this will be false after the above addition
您可以在这里看到您想要的结果:http://jsbin.com/vicemiqiqu/1/edit?js,console
我了解到,在使用 Object.assign() 时,它仅扩展顶级对象。如何深入扩展对象?例如,假设我有以下源对象:
const source = {
id: 1,
otherKey: {},
params: {
page: {
a: 1,
b: {}
},
data: {
b: 1
}
}
}
我正在这样使用 Object.assign()
:
Object.assign({}, source, {
params: {
page: {
a: 2
}
}
}
结果将是:
{
id: 1,
otherKey: {},
params: {
page: {
a: 2
}
}
}
如何以浅克隆方式保留 params.data 键和 params.page.b 键。
oldObject.params.data === newObject.params.data // true
oldObject.params.page === newObject.params.page // false
oldObject.params.page.b === newObject.params.page.b // true
注:本题与How to deep merge instead of shallow merge不一样。那里的答案没有给出预期的结果。
检查这个 bin,它从上面 link 中得到答案。
所以在您发布的代码中,如果源和目标都包含相同的密钥,那么什么也不会发生。该对象向下递归给子对象。但是,如果您只是将内部块更改为:
if (!target[key]) {
Object.assign(target, { [key]: {} });
}else{
target[key] = Object.assign({}, target[key])
}
mergeDeep(target[key], source[key]);
这将为在源和目标中找到的任何键创建一个新的分配对象。有趣的是,如果您这样做,您预期的 falseys
将不会出现在控制台中。这是因为目标将 总是 匹配结果,因为它是最终的变异对象。因此,为了获得预期的 false
结果,您需要执行以下操作:
var tester = source.params
const result = mergeDeep(source, b)
console.log(tester === result.params) // this will be false after the above addition
您可以在这里看到您想要的结果:http://jsbin.com/vicemiqiqu/1/edit?js,console