• 微信小程序中实现将数据库返回的数据对象res.data赋值给两个变量,并且这两个变量互不影响,改变一个变量中对象值的同时不影响另一个变量


    背景 

    今天在做功能需求的时候,遇到一个问题,就是想把获取到数据库的数据res.data(res.data是对象),赋值给两个不同(包括值和地址)的变量action1和action2,其中一个变量需要将res.data中的时间格式化。

    action1用于信息展示,action2用于原始数据后续数据库添加有用。

    如果直接这样操作:

    1. var action1 = res.data
    2. var action2 = res.data
    3. action1.starttime = util.formatTime(new Date(action1.starttime))
    4. action1.endtime = util.formatTime(new Date(action1.endtime))
    5. that.setData({
    6. action1,
    7. action2,
    8. })

    实际上,action1在时间格式化后,虽然“看起来”两个变量不一样了,其实action1和action2是一样的,因为res.data为对象是引用类型,action1和action2保存的是栈内存中的地址,无论改变action1还是action2,都是改变栈内存地址所指向的堆内存中的数据。那如何解决呢?其实用js深拷贝就能解决

    解决方案

    为了实现目标,需要创建两个独立的变量,使它们不共享同一个引用。你可以使用深拷贝来创建res.data的副本

    利用深拷贝中最简单的方式,对res.data进行序列化JSON.parse(JSON.stringify(res.data))

    1. var action1 = JSON.parse(JSON.stringify(res.data))
    2. var action2 = res.data
    3. action1.starttime = util.formatTime(new Date(action1.starttime))
    4. action1.endtime = util.formatTime(new Date(action1.endtime))
    5. that.setData({
    6. action1,
    7. action2,
    8. })

    使用 JSON.parse(JSON.stringify(res.data)) 方法创建action1的深拷贝,这样action1和action2就是两个独立的对象,修改action1不会影响action2。

    当然对于解决功能上问题还有其它解决方案,以前没有用到,现在总结一波,如果这篇文章对您有所帮助,麻烦给个小🌹吧!

  • 相关阅读:
    Java中线程池的创建与使用
    Acwing -树型DP(自用)
    java开放式实验室预约系统计算机毕业设计MyBatis+系统+LW文档+源码+调试部署
    记笔记!电源自动测试系统测试电源纹波详细方法
    微信小程序vue.js+uniapp服装商城销售管理系统nodejs-java
    Keil转STM32CubeIDE工程移植问题记录
    yolov
    6、Elasticsearch 检索文档的方式
    WebView 以及如何测试
    hive sql 按照字段拆分之后(列转行)进行映射,再进行列转行
  • 原文地址:https://blog.csdn.net/weixin_57177381/article/details/139710141