复杂数组结构的深拷贝

时间:2022-10-10 19:57:12

之前在项目遇到一个问题,就是提交表单的时候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))

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