深拷贝用于工作中实现功能

深拷贝的方式

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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值