You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:12:02