【问题标题】:Object.Assign() without overriding existing propertiesObject.Assign() 不覆盖现有属性
【发布时间】:2020-03-28 08:54:16
【问题描述】:

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

我有一个像这样的 json 模型

json 模型“数据”

{
   "RegisteredAddress": "1 street, Sw3 1aq",
   "TradingAddress": "2 street, sw4, 5ad",
}

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

AddressModel.ts 'addressModel'

{
   "RegisteredAddress": null,
   "TradingAddress": null,
   "PreviousAddresses": ["Previous Address Street, RH10 1BG"]
}

我是否可以使用 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"]
}

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

【问题讨论】:

    标签: javascript json typescript ecmascript-6


    【解决方案1】:

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

    this.addressModel = Object.assign({}, data, this.addressModel);
    

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

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

    模型的大小在这里并不重要,无论是在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;
        }
    }
    

    【讨论】:

    • 谢谢!所以这实际上创建了 AddressModel.ts 的副本,然后将其重新分配回原始模型而不覆盖?
    • @jjharrison - 如果你的意思是第一个 cole 块,实际上,是的 - 它用新对象覆盖 this.addressModel 中的对象引用,但原始 this.addressModel 上的任何自己的属性都将具有它们的值在新对象中保持不变。只有没有冲突的属性才会来自datasecond 代码块只是直接更新现有对象(同样,仅当它没有属性时)。
    • @TJCrowder -“模型的大小在这里并不重要,它是一个循环,无论是在 Object.assign 还是在你的代码中。”你能指出一个参考,我可以看到如何Object.assign 实现了吗?我没想到 Object.assign 会使用循环...
    • @paroxyzm - 在the specification。我想不出任何其他可以实现的方式。 :-)
    猜你喜欢
    • 2017-05-26
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 2018-02-27
    • 2022-11-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-19
    相关资源
    最近更新 更多