深拷贝的方式
1、JSON.parse(JSON.stringify()) 缺点: 无法拷贝 函数、正则、时间格式、原型上的属性和方法等
2、递归实现深拷贝
手写深拷贝:
// 使用hash 存储已拷贝过的对象,避免循环拷贝和重复拷贝
function deepClone(target, hash = new WeakMap()) {
if (!isObject(target)) return target;
if (hash.get(target)) return hash.get(target);
// 兼容数组和对象
let newObj = Array.isArray(target) ? [] : {};
// 关键代码,解决对象的属性循环引用 和 多个属性引用同一个对象的问题,避免重复拷贝
hash.set(target, newObj);
for (let key in target) {
if (target.hasOwnProperty(key)) {
if (isObject(target[key])) {
newObj[key] = deepClone(target[key], hash); // 递归拷贝
} else {
newObj[key] = target[key];
}
}
}
return newObj;
}
function isObject(target) {
return typeof target === "object" && target !== null;
}
使用WeakMap的好处是,WeakMap存储的key必须是对象,并且key都是弱引用,便于垃圾回收
通过筛选的数据对左侧panel控制其数据显示隐藏
// 定制控制数据
let arr1 = []; // 筛选出来选中的数据
let chinaData = JSON.parse(JSON.stringify(this.product.product_testchina));
//data_ 筛选的初始值
data_.forEach((item, index) => {
item.children.forEach((child, childIndex) => {
if (child.checked) {
arr1.push(child.title);
child.children.forEach((data, index) => {
if (data.checked) {
arr1.push(data.title);
if (data.children) {
data.children.forEach((th, thind) => {
if (th.checked) {
arr1.push(th.title);
}
});
}
}
});
}
});
});
拷贝赋值
function deepFunction(data, list) {
for (let i = 0; i < data.length; i++) {
if (i < 0) return
if (data[i].childen && data[i].childen.length) {
data[i].childen = lookmenu(data[i].childen, list)
}
}
function lookmenu(arr, lists) {
for (let i = 0; i < arr.length; i++) {
if (i < 0) return
if (arr[i].title && lists.indexOf(arr[i].title) < 0) {
arr.splice(i, 1)
i--
} else if (arr[i].menus && arr[i].menus.length) {
arr[i].menus = lookmenu(arr[i].menus, lists)
}
}
return arr
}
return data
}
最后把筛选的值放入拷贝的函数中
this.customData = deepFunction(chinaData, arr1)