复杂数组结构的深拷贝

之前在项目遇到一个问题,就是提交表单的时候DOM结构上绑定的数值,会在提交的一瞬间发生改变,然后发现,是我自己在提交表单的时候,对数组进行了操作而引起的的,为了避免这种,情况,可以使用深拷贝出来一个数组,进行操作,这样就不会影响,原来的数据;

常见的数据数组深拷贝方法:

(1)对于array对象的slice函数, 
返回一个数组的一段。(仍为数组) 
arrayObj.slice(start, [end])  
参数 
arrayObj  
必选项。一个 Array 对象。  
start  
必选项。arrayObj 中所指定的部分的开始元素是从零开始计算的下标。  
end  
可选项。arrayObj 中所指定的部分的结束元素是从零开始计算的下标。  
说明 
slice 方法返回一个 Array 对象,其中包含了 arrayObj 的指定部分。 
slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中

(2)concat() 方法用于连接两个或多个数组。
该方法不会改变现有的数组,而仅仅会返回被连接数组的一个副本。
语法
arrayObject.concat(arrayX,arrayX,......,arrayX)
说明
返回一个新的数组。该数组是通过把所有 arrayX 参数添加到 arrayObject 中生成的。如果要进行 concat() 操作的参数是数组,那么添加的是数组中的元素,而不是数组。
var arr = ["One","Two","Three"];

上面两种方法,对简单的数据结构有效,但是遇到复杂的数据结构的时候,就没有效果了

那么我们可以尝试下面这种方法:

NewData = JSON.parse(JSON.stringify(Olddata))

这个就是会把原来的数据转化为字符串,这是针对对象的所有引用关系就不复存在了,然后再转化回来就是一个全新的对象。不在出现新对象改动污染原始对象的问题了。

时间: 2024-08-25 21:22:41

复杂数组结构的深拷贝的相关文章

微信开发中用到的几个数组结构

这几天升级扬帆cms,支持微信,用到了https://github.com/dodgepudding/wechat-php-sdk, 其中涉及到几个数组结构,备忘一下: // 自定义菜单数组// 菜单1及其子菜单$menusArray [0] ['name'] = '菜单1';$menusArray [0] ['type'] = 'click';$menusArray [0] ['key'] = 'menu_1';// 子菜单为消息类型$menusArray [0] ['sub_button']

c柔性数组结构成员

C99中,结构中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员,但结构中的柔性数组成员前面必须至少一个其他成员.柔性数组成员允许结构中包含一个大小可变的数组.sizeof返回的这种结构大小不包括柔性数组的内存.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,以适应柔性数组的预期大小. 结构体变长的妙用——0个元素的数组 有时候我们需要定义一种可变长结构体. typedef struct st_type  {  int nCnt;  i

jquery类数组结构学习笔记

大家都知道我们使用$()产生的jquery对象可以使用下标去获取对应下标的元素. 举个栗子,一个页面有5个div标签,我们使用$("div")去获取到这些元素,然后我们就可以使用$("div")[0]去获取到这个元素集合的第一个元素. 但是jquery并不是一个数组对象,那我们为什么可以使用下标去获取元素呢?查看jquery源码中的init方法,可以看到以下代码(这是我简化版的写法,省略了与该文章不相干的代码): function Jquery() { this[0

java实现无序数组结构

一.数组的2种定义方式 数据类型 []  数组名称 = new 数据类型[数组长度]; 这里 [] 可以放在数组名称的前面,也可以放在数组名称的后面,一般放在名称的前面 数据类型 [] 数组名称 = {数组元素1,数组元素2,......} 这种方式声明数组的同时直接给定了数组的元素,数组的大小有给定的数组元素个数决定 public class ArrayStruct { public static void main(String[] args) { // int[] nums = new i

用数组结构实现大小固定的栈和队列

给定长度为size的数组,将其长度设置为大小为size的栈(队列),添加的数字如果超过了既定的长度就报错! 先实现栈(先进后出): 后实现队列(先进先出): 代码如下: 1 //例子:长度为6的数组,设置大小为6的栈,超过长度就会报错 2 //用数组结构实现大小固定的队列和栈 3 public class Bokeyuan { 4 //使用数组实现栈 5 public static class ArrayStack{ 6 private Integer[] arr;//数组 7 private

第五章:数组 结构体 和联合体

1.结构体 2.联合体 3.结构体和联合体的操作 4.非压缩数组 5.压缩数组 6.数组操作 7.数组foreache 循环 8.用于数组的特殊系统函数 结构体 1.结构体成员可以是任何数据类型 包括基本类型和用户自定义类型 2.结构体的声明 var/wire 都可以定义为结构体类型.当定义为结构体类型时,结构体中的成员都必须是四态类型,成员不能是wire类型. 3.结构体的初始化 用值列表方式初始化 '{} 4.结构体的赋值 5.压缩结构体 可以视为独立的变量,具体与向量类似的操作 6.非压缩

[C++][数据结构][算法]单链式结构的深拷贝

单链式结构是相当普遍的一种结构.它不但被广泛地用来实现单链表,栈,队列等数据结构,而且还是谭浩强先生<C程序设计>中唯一介绍到的数据结构——这充分体现了此数据结构结构的广泛性与实用性. 设我们的结构是这样的: 1 template <class value> 2 struct node { 3 value val; 4 node *next = nullptr; 5 }; 然后定义并初始化了一个单链表list1: 1 typedef node<int> in; 2 in

C数组&amp;结构体&amp;联合体快速初始化

背景 C89标准规定初始化语句的元素以固定顺序出现,该顺序即待初始化数组或结构体元素的定义顺序. C99标准新增指定初始化(Designated Initializer),即可按照任意顺序对数组某些元素或结构体某些成员进行选择性初始化,只需指明它们所对应的数组下标或结构体成员名.GNU C将其作为C89模式的扩展. 借助指定初始化特性,可实现数组或结构体元素的快速初始化. 1 数组初始化 在数组初始化列表中使用"[index常量表达式]=value"形式可对index所指定的某个元素进

OC数组中的深拷贝

浅拷贝与深拷贝 首先回顾下,浅拷贝:即指针拷贝,源对象和新对象指向的是同一个地址,也就是说浅拷贝要复出出来一个新的文件,但两个文件的地址还是一个.浅拷贝的话是只有不可变数组(如:NSArray,NSSet,NS字典)遇上copy,才是浅拷贝,剩下的都是深拷贝. 例如: Dog * dog1 = [Dog new]; // 这里就是浅拷贝,即指针拷贝 Dog * dog2 = dog1; 而深拷贝,自己定义的类一般需要遵循 NSCopying, NSMutableCopying 协议,例如 Dog