热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【微信小程序开发笔记】--偶遇js深拷贝与浅拷贝问题

微信小程序开发笔记(一)–偶遇深拷贝与浅拷贝问题js文件***选择数据--checkbox复选框监听事件value值|需要上传的数据|不需要上传的数据*

微信小程序开发笔记(一)–偶遇深拷贝与浅拷贝问题

  • js文件
/** * 选择数据--checkbox复选框监听事件value值 | 需要上传的数据 | 不需要上传的数据 */
  checkboxChange: function (e) {

    //不需要上传的数据
    var nOneedToUpLoad= new Array()
    //需要上传的数据
    var needToUpLoad = new Array()
    //删除后需要上传的数据
    var fUpLoad = new Array()
    //选择的企业数据
    var checkedRegNo = e.detail.value;
    //
    var allDataleng = this.data.moreLocal.length;
    //取出需要上传的数据
    for (var i = 0; i var tmpobj = this.data.moreLocal[i];
      var regNo = tmpobj.REGISTERNO;
      var isck = 1;
      for (var j = 0; j if (regNo == checkedRegNo[j]) {
          isck = 2;
          break;
        }
      }
      if (isck == 1) {
        noNeedToUpLoad.push(tmpobj);
      } else {
        needToUpLoad.push(tmpobj);
      }
    }

    //最简单的深拷贝实例,将数组对象转为字符串之后就与源对象无关联,再将字符串转为数组对象 | //深拷贝√ | 浅拷贝
    fUpLoad = JSON.parse(JSON.stringify(needToUpLoad))
    //大方删除不需要的数据
    for (var l = 0; l delete fUpLoad[l].EQUIPADDRESS;
      delete fUpLoad[l].EQUIPMENTTYPE;
      delete fUpLoad[l].INCHECKDATE;
      delete fUpLoad[l].OUTCHECKDATE;
      delete fUpLoad[l].USENO;
      delete fUpLoad[l].registerNo;
      delete fUpLoad[l].unitName;
    }

    this.setData({
      upLoadData: fUpLoad,
      noUpLoadData: noNeedToUpLoad,
    })

    console.log('不不不不需要上传的数据nOneedToUpLoad==============:'),
      console.log(noNeedToUpLoad);
    console.log('需要上传的数据needToUpLoad==============:'),
      console.log(needToUpLoad);

    console.log('最终需要上传的数据fUpLoad==============:'),
      console.log(fUpLoad);
  },

代码场景:
1. 这段代码中,this.data.moreLocaldata({})中定义为数组,存放目标对象
2. 需要通过checkboxChange方法将checkbox-groupvalue值选择出来
3. 当value值与目标对象moreLocal[i].REGISTERNO相等即为要上传的数据needToUpLoad,否则不上传needToUpLoad
4. 然后将需要上传的数据删减某些元素后再进行上传fUpLoad

貌似思路很清晰,流程很顺畅,但是当在使用的时候,才发现,倘若使用fUpLoad = needToUpLoad 直接将需要上传的赋值出来,在对fUpLoad中的元素执行删减delete这一操作的同时,会发现原来的needToUpLoad也会跟着变化,因为这就涉及到Javascript语言中的深拷贝浅拷贝的问题。

那什么是深拷贝浅拷贝呢?

简单理解来说,深拷贝和浅拷贝针对于ObjectArray的复杂对象来说的:
浅拷贝只是对对象的地址的复制,并没有开辟新的栈内存,也就是fUpLoadneedToUpLoad都指向同一个栈地址,对其中一个进行删减时,另外一个的值也会同样发生变化,这肯定不是想要看到的结果;
深拷贝则是拷贝了对象后存放到新的栈中保存,两者指向不同的栈,改变其中一个值并不会影响到另一个的值。

大致了解了是什么就找找方法进行深拷贝吧,但是最后发现jsslice函数和concat方法都达不到该效果,needToUpLoad是一个数组,数组元素又是一个对象,即使遍历needToUpLoad后一个个拷贝出来,也不能够达到深拷贝的目的

最简单的一个深拷贝方法:一个简单但是很有效的方法,就是代码中的fUpLoad = JSON.parse(JSON.stringify(needToUpLoad)),将数组对象转为字符串之后就与源数组无关联,再将字符串转为数组对象,即可达到深拷贝的目的

那在对fUpLoad进行删减元素时就不会影响到原来的数组了


代码片段直接使用了项目中的一段,没有写一下示例代码,谨以此当做记录一下笔记吧

参考:Javascript中的深拷贝和浅拷贝?


推荐阅读
  • 在处理木偶评估函数时,我发现可以顺利传递本机对象(如字符串、列表和数字),但每当尝试将JSHandle或ElementHandle作为参数传递时,函数会拒绝接受这些对象。这可能是由于这些句柄对象的特殊性质导致的,建议在使用时进行适当的转换或封装,以确保函数能够正确处理。 ... [详细]
  • JavaScript XML操作实用工具类:XmlUtilsJS技巧与应用 ... [详细]
  • C++ 异步编程中获取线程执行结果的方法与技巧及其在前端开发中的应用探讨
    本文探讨了C++异步编程中获取线程执行结果的方法与技巧,并深入分析了这些技术在前端开发中的应用。通过对比不同的异步编程模型,本文详细介绍了如何高效地处理多线程任务,确保程序的稳定性和性能。同时,文章还结合实际案例,展示了这些方法在前端异步编程中的具体实现和优化策略。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 在 Vue 应用开发中,页面状态管理和跨页面数据传递是常见需求。本文将详细介绍 Vue Router 提供的两种有效方式,帮助开发者高效地实现页面间的数据交互与状态同步,同时分享一些最佳实践和注意事项。 ... [详细]
  • 使用 Vuex 管理表单状态:当输入框失去焦点时自动恢复初始值 ... [详细]
  • 本文深入探讨了C#中的反射与特性功能。首先,介绍了反射的基本概念,即通过元数据(包括类的方法、属性和字段等)在运行时动态获取和操作程序信息的能力。此外,还详细解析了特性的使用方法及其在代码注解和元数据扩展中的重要作用,为开发者提供了丰富的编程技巧和实践指导。 ... [详细]
  • 本文深入探讨了JavaScript中`this`关键字的多种使用方法和技巧。首先,分析了`this`作为全局变量时的行为;接着,讨论了其在对象方法调用中的表现;然后,介绍了`this`在构造函数中的作用;最后,详细解释了通过`apply`等方法改变`this`指向的机制。文章旨在帮助开发者更好地理解和应用`this`关键字,提高代码的灵活性和可维护性。 ... [详细]
  • 第六章:枚举类型与switch结构的应用分析
    第六章深入探讨了枚举类型与 `switch` 结构在编程中的应用。枚举类型(`enum`)是一种将一组相关常量组织在一起的数据类型,广泛存在于多种编程语言中。例如,在 Cocoa 框架中,处理文本对齐时常用 `NSTextAlignment` 枚举来表示不同的对齐方式。通过结合 `switch` 结构,可以更清晰、高效地实现基于枚举值的逻辑分支,提高代码的可读性和维护性。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文探讨了如何利用 jQuery 的 JSONP 技术实现跨域调用外部 Web 服务。通过详细解析 JSONP 的工作原理及其在 jQuery 中的应用,本文提供了实用的代码示例和最佳实践,帮助开发者解决跨域请求中的常见问题。 ... [详细]
  • 本文探讨了利用JavaScript实现集合的对称差集算法的方法。该算法旨在处理多个数组作为输入参数,同时保留每个数组中元素的原始顺序。算法不会移除单个数组内的重复元素,但会删除在不同数组之间出现的重复项。通过这种方式,能够有效地计算出多个数组的对称差集。 ... [详细]
  • Java解析YAML文件并转换为JSON格式(支持JSON与XML的结构化查询)
    本文探讨了如何利用Java解析YAML文件并将其转换为JSON格式,同时支持JSON和XML的结构化查询。YAML、JSON和XML这三种数据格式通过其名称作为文件扩展名,便于区分和使用。文章详细介绍了这些格式的层次结构和数据表示方法,并重点讨论了在数据传输过程中,XML的特性和优势。此外,还提供了具体的代码示例和实现步骤,帮助开发者高效地进行数据格式转换和查询操作。 ... [详细]
author-avatar
家具销售_903
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有