背景
今天在做功能需求的时候,遇到一个问题,就是想把获取到数据库的数据res.data(res.data是对象),赋值给两个不同(包括值和地址)的变量action1和action2,其中一个变量需要将res.data中的时间格式化。
action1用于信息展示,action2用于原始数据后续数据库添加有用。
如果直接这样操作:
- var action1 = res.data
- var action2 = res.data
-
- action1.starttime = util.formatTime(new Date(action1.starttime))
- action1.endtime = util.formatTime(new Date(action1.endtime))
-
- that.setData({
- action1,
- action2,
- })
实际上,action1在时间格式化后,虽然“看起来”两个变量不一样了,其实action1和action2是一样的,因为res.data为对象是引用类型,action1和action2保存的是栈内存中的地址,无论改变action1还是action2,都是改变栈内存地址所指向的堆内存中的数据。那如何解决呢?其实用js深拷贝就能解决
解决方案
为了实现目标,需要创建两个独立的变量,使它们不共享同一个引用。你可以使用深拷贝来创建res.data的副本
利用深拷贝中最简单的方式,对res.data进行序列化JSON.parse(JSON.stringify(res.data))
- var action1 = JSON.parse(JSON.stringify(res.data))
- var action2 = res.data
-
- action1.starttime = util.formatTime(new Date(action1.starttime))
- action1.endtime = util.formatTime(new Date(action1.endtime))
-
- that.setData({
- action1,
- action2,
- })
使用 JSON.parse(JSON.stringify(res.data)) 方法创建action1的深拷贝,这样action1和action2就是两个独立的对象,修改action1不会影响action2。
当然对于解决功能上问题还有其它解决方案,以前没有用到,现在总结一波,如果这篇文章对您有所帮助,麻烦给个小🌹吧!