Node.js中使用Object.assign和扩展运算符拷贝后备份对象仍被修改问题
问题核心原因
你使用的{...obj}展开语法、Object.assign都属于浅拷贝,仅能复制对象第一层的基础类型值,对于第一层值为引用类型(对象、数组)的属性,复制的只是内存地址引用,并没有生成独立的新对象。
对应你的代码场景:拷贝docid[0][0].Record得到originalData时,originalData.mailingAddress和docid[0][0].Record.mailingAddress指向完全相同的对象。后续你用_.extend修改docid[0][0].Record.mailingAddress时,本质是修改了这个共享的对象,自然会同步反映到originalData上。
解决方案
方案1:单独处理嵌套属性的拷贝
如果仅需要处理mailingAddress这一层的独立拷贝,可以在生成originalData时单独处理该属性:
// 展开语法写法 const originalData = { ...docid[0][0].Record, mailingAddress: {...docid[0][0].Record.mailingAddress} } // Object.assign写法 const originalData = Object.assign({}, docid[0][0].Record, { mailingAddress: Object.assign({}, docid[0][0].Record.mailingAddress) })
方案2:完整深拷贝
如果对象层级更深、或者不确定层级,可以直接做完整深拷贝:
- 现代浏览器原生支持
structuredClone方法,无需引入第三方库:
const originalData = structuredClone(docid[0][0].Record)
- 你已经引入了lodash,也可以直接用lodash提供的深拷贝方法:
const originalData = _.cloneDeep(docid[0][0].Record)
额外优化提示
你使用的_.extend会直接修改第一个入参的对象,如果你不需要修改原始docid[0][0].Record.mailingAddress,可以把第一个入参改为空对象:
let MailingAddress = _.extend({}, docid[0][0].Record.mailingAddress, MailingAddrObj)
内容的提问来源于stack exchange,提问作者SamS87
相关产品推荐
相关产品推荐

