• 微信小程序中实现将数据库返回的数据对象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。

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

  • 相关阅读:
    二叉搜索树(BST,Binary Search Tree)
    【ARC104F】Visibility Sequence(区间DP)
    C#8.0本质论第五章--方法和参数
    并查集应用
    【毕业设计】 单片机自动写字机器人设计与实现 - 物联网 嵌入式 stm32
    旅游计划定制小程序网页模板源码
    2022/09/16、17 day05/06:HTML和CSS
    混凝土基础的智能设计:VisualFoundation 12.0 Crack
    【字符串】检查单词是否为句中其他单词的前缀
    蓝桥杯 字符串和日期
  • 原文地址:https://blog.csdn.net/weixin_57177381/article/details/139710141