Object.Assign() 不覆盖现有属性

jjh*_*son 1 javascript json typescript ecmascript-6

请原谅这个标题,因为我不确定这是否可能。

我有一个像这样的 json 模型

json 模型“数据”

{
   "RegisteredAddress": "1 street, Sw3 1aq",
   "TradingAddress": "2 street, sw4, 5ad",
}
Run Code Online (Sandbox Code Playgroud)

我想映射到一个看起来像这样的模型

AddressModel.ts 'addressModel'

{
   "RegisteredAddress": null,
   "TradingAddress": null,
   "PreviousAddresses": ["Previous Address Street, RH10 1BG"]
}
Run Code Online (Sandbox Code Playgroud)

我可以使用Object.Assign(this.addressModel, data); 而不覆盖 Address.ts 模型上现有的填充属性。我本质上只想填充 json 模型中的字段,而不覆盖正在分配的 json 上不存在的任何现有属性。最终结果应该是

AddressModel.ts 'addressModel'

{
   "RegisteredAddress": "1 street, Sw3 1aq",
   "TradingAddress": "2 street, sw4, 5ad",
   "PreviousAddresses": ["Previous Address Street, RH10 1BG"]
}
Run Code Online (Sandbox Code Playgroud)

了解我可以手动映射这些属性,但这是一个示例,我正在使用更大的模型。

T.J*_*der 5

如果您想用于Object.assign此目的,您可以将所有内容分配给this.addressModel最后列出的新对象:

this.addressModel = Object.assign({}, data, this.addressModel);
Run Code Online (Sandbox Code Playgroud)

这样,this.addressModel当它具有也在 中的属性时,“获胜” data

了解我可以手动映射这些属性,但这是一个示例,我正在使用更大的模型。

模型的大小在这里并不重要,无论它是在Object.assign代码中还是在代码中,它都是一个循环。代码中的循环将类似于:

for (const [key, value] of Object.entries(data)) {
    if (!(key in this.addressModel)) { // Or `!this.addressModel.hasOwnProperty(key)` or `!Object.prototype.hasOwnProperty.call(this.addressModel, key)` depending on what you want to check and your style
        this.addressModel[key] = value;
    }
}
Run Code Online (Sandbox Code Playgroud)