数组对象的拷贝

数组对象的拷贝

错误方式: 

let arr1 = [{isShow: true,value:testValue}];

let arr2 = [...arr1];// 采用es6解构赋值的方式

let listItems = [];

arr2.foreach( (item)=> {

if (item.isShow == true) {

let reg = RegExp(/Value/);

if (reg.exec(item.value)) {

item.value = item.value.split("V")[0];

}

listItems.push(item.value);

})

console.log("复制后的数组",arr2);

console.log("原数组",arr1);

//结果显示:原数组被污染
//原因: es6的解构赋值只对一维数组的操作,即只对基础类型的拷贝,无法拷贝引用类型。

正确的方式:
(1)深拷贝

deepCopy.js 里写的封装好的deepCopy,如下:

// 深拷贝

class DeepCopy {

deepCopy(arr) {

let copyArr = (arr.constructor === Array) ? [] : {}; // 判断是数组还是对象

for (let i in arr) {

if (typeof arr[i] === 'object') { // 判断是值类型还是引用类型

copyArr[i] = this.deepCopy(arr[i]); // 引用类型的话进行递归操作

} else {

copyArr[i] = arr[i]; // 值类型直接赋值

}

}

return copyArr;

}

}

 

var deepCopy = new DeepCopy();

export default deepCopy;

——————————————————————————

在组件里引用deepCopy.js  ,//放置的路径根据自己项目配置
我的项目路径: import deepCopy from "@/lib/deepCopy.js";

let arr1 = [{isShow: true,value:testValue}];

let copyCols = deepCopy.deepCopy(arr1);

copyCols.forEach(item => {

if (item.isShow == true) {

let reg = RegExp(/Value/);

if (reg.exec(item.value)) {

item.value = item.value.split("V")[0];

}

 listItems.push(item.value);

 }

 });

console.log("原数组",arr1); // 此时原数组未被污染

(2) 序列化和反序列化的方式

let arr1 = [{isShow: true,value:testValue}];

let colsString = JSON.stringify(arr1)

let colsArr = JSON.parse(colsString);

colsArr.forEach(item => {

if (item.isShow == true) {

let reg = RegExp(/Value/);

if (reg.exec(item.value)) {

item.value = item.value.split("V")[0];

}

listItems.push(item.value);

}

});

console.log("原数组",arr1); // 此时原数组未被污染

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页