首页 > 其他分享 >实现深度克隆拷贝

实现深度克隆拷贝

时间:2022-09-26 19:25:05浏览次数:53  
标签:map newParent return 克隆 parent flag 深度 const 拷贝

 

// 判断是否是某类型
const isType = (obj, type) => {
  if (typeof obj !== 'object') return false;
  const typeString = Object.prototype.toString.call(obj);
  let flag;
  switch (type) {
    case 'Array':
      flag = typeString === '[object Array]';
      break;
    case 'Date':
      flag = typeString === '[object Date]';
      break;
    case 'RegExp':
      flag = typeString === '[object RegExp]';
      break;
    default:
      flag = false;
  }
  return flag;
};
// 获取到正则修饰符
const getRegExp = re => {
  var flags = '';
  if (re.global) flags += 'g';
  if (re.ignoreCase) flags += 'i';
  if (re.multiline) flags += 'm';
  return flags;
};
// 深度克隆
const deepClone = parent => {
  // 旧对象 :新对象 map
  let _map = new WeakMap();

  const _clone = parent => {
    if (parent === null) return null;
    if (typeof parent !== 'object') return parent;
    if(_map.get(parent)){
      return _map.get(parent)
    }
     
    let newParent;
    if (isType(parent, 'Array')) {
      // 对数组做特殊处理
      newParent = [];
    } else if (isType(parent, 'RegExp')) {
      // 对正则对象做特殊处理
      newParent = new RegExp(parent.source, getRegExp(parent));
      if (parent.lastIndex) newParent.lastIndex = parent.lastIndex;
    } else if (isType(parent, 'Date')) {
      // 对Date对象做特殊处理
      newParent = new Date(parent.getTime());
    } else {
      // 处理对象原型
      newParent = Object.create(parent.__proto__);
    }
    
    _map.set(parent, newParent);
    for (let i in parent) {
      // 递归
      newParent[i] = _clone(parent[i]);
    }

    return newParent;
  };
  return _clone(parent);
};

  

标签:map,newParent,return,克隆,parent,flag,深度,const,拷贝
From: https://www.cnblogs.com/shaoyunfeng93/p/16732054.html

相关文章

  • 【转载】Python的深浅拷贝以及应用场景
    深浅拷贝的原理深浅拷贝用法来自copy模块。导入模块:importcopy浅拷贝:copy.copy深拷贝:copy.deepcopy字面理解:浅拷贝指仅仅拷贝数据集合的第一层数据,深拷贝指拷贝数据......
  • VMware虚拟机怎么快速克隆一台linux
    1、如图所示,点击“克隆”按钮  注意,克隆之前选择的机器需要关机!2、如图,点击“下一步”  下一步  3、选择“创建完整克隆”,默认的是第一个,不要选第一个......
  • react组件深度解读
    五、React核心是组件在React中,我们使用组件(有状态、可组合、可重用)来描述UI。在任何编程语言中,你都可以将组件视为简单的函数。React组件也一样,它的输入是props......
  • git 库克隆下来的laravel 代码报错
    错误:Warning:require(E:\phpstudy_pro\WWW\blog\public/../vendor/autoload.php):failedtoopenstream:Nosuchfileordirectoryin E:\phpstudy_pro\WWW\blog\pu......
  • Elasticsearch from/size-浅分页查询-深分页 scroll-深分页search_after深度查询区别
    Elasticsearch调研深度查询1.from/size浅分页查询一般的分页需求我们可以使用from和size的方式实现,但是这种的分页方式在深分页的场景下应该是避免使用的。深分页的页次......
  • 二叉树的最大深度
    二叉树的最大深度一、题目描述给定一个二叉树,找出其最大深度。二叉树的最大深度为根节点到最远叶子节点的最长路径上的节点数。叶子节点时没有字节点的。实例:给定二叉......
  • 零拷贝
    零拷贝不是值得不拷贝,而是0次cpu拷贝。 传统拷贝一个文件并且通过网络IO发送一个文件的发送端文件拷贝过程需要经过 DMA拷贝->cpu拷贝->cpu拷贝-DMA拷贝 第一......
  • 【JAVA】普通IO数据拷贝次数的问题探讨
    最近看到网上有些文章在讨论JAVA中普通文件IO读/写的时候经过了几次数据拷贝,如果从系统调用开始分析,以读取文件为例,数据的读取过程如下(以缓存I/O为例):应用程序调用read函......
  • js深拷贝
    1.//深拷贝functiondeepclone(obj){letnewobj=Array.isArray(obj)?[]:{}for(letkeyinobj){if(typeofobj[key]==='object'){newobj[ke......
  • 深度学习:计算机视觉
    1、图像增广图像增广(imageaugmentation)技术通过对训练图像做一系列随机改变,来产生相似但又不同的训练样本,从而扩大训练数据集的规模。图像增广的另一种解释是,随机改变训......