资讯专栏INFORMATION COLUMN

20190805-前端笔记-利用DFS广度优先遍历实现深拷贝

shiweifu / 821人阅读

摘要:从这步开始,才是进行深度赋值进一步遍历每一个属性,进行赋值如果是,就直接以后赋值其他类型,直接赋值

定义一些工具函数

    let _toString = Object.prototype.toString
    // 类型库
    let map = {
      array: "Array",
      object: "Object",
      function: "Function",
      string: "String",
      null: "Null",
      undefined: "Undefined",
      boolean: "Boolean",
      number: "Number"
    }

    // 获取类型
    let getType = item => {
      // console.log(_toString.call(item))
      // [object Number]

      return _toString.call(item).slice(8, -1) // Number
    }
    
    // 判断类型是否相同
    let isType = (item, type) => map[type] && map[type] === getType(item)
let deepCopy = (obj, protoList = []) => {
      // 首先定义需要被拷贝的对象
      let _obj = {}
      // 判断对象的类型
      if (isType(obj, "array") || isType(obj, "objest")) {
        //  根据obj类型,转换_obj的类型
        if (isType(obj, "array")) _obj = []

        //  判断obj是否在其父属性列表中包含该属性
        let index = protoList.indexOf(obj)

        if (~index) {
          // 如果包含该对象,就不能循环了,直接复制_obj
          _obj = protoList[index]
        } else {
          // 如果不包含,先将被赋值对象push值属性列表中,然后进行循环obj的属性,进行赋值。
          protoList.push(obj)
          // 从这步开始,才是进行深度赋值
          for (let item in obj) {
            // 进一步遍历每一个属性,进行赋值
            _obj[item] = deepCopy(pbj[item], protoList)
          }
        }
      } else if (isType(obj, "function")) {
        // 如果是function,就直接string以后赋值
        _obj = eval(`(${obj.toString()})`)
      } else {
        // 其他类型,直接赋值
        _obj = obj
      }
      return _obj
    }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106405.html

相关文章

  • LeetCode 133:克隆图 Clone Graph

    摘要:解题思路涉及到图的遍历无非就是深度优先搜索广度优先搜索,可以先看前几日的这篇文章就需要借助队列实现,可以借助栈也可以直接用递归实现。 题目: 给定无向连通图中一个节点的引用,返回该图的深拷贝(克隆)。图中的每个节点都包含它的值 val(Int) 和其邻居的列表(list[Node])。 Given a reference of a node in a connected undirec...

    Simon 评论0 收藏0
  • JS算法之优先遍历(DFS)和广度优先遍历(BFS)

    摘要:算法之深度优先遍历和广度优先遍历背景在开发页面的时候,我们有时候会遇到这种需求在页面某个节点中遍历,找到目标节点,我们正常做法是利用选择器,或者,但在本文,我们从算法的角度去查找节点,同时理解一下深度优先遍历和广度优先遍历的原理。 JS算法之深度优先遍历(DFS)和广度优先遍历(BFS) 背景 在开发页面的时候,我们有时候会遇到这种需求:在页面某个dom节点中遍历,找到目标dom节点,...

    roadtogeek 评论0 收藏0
  • 拷贝的终极探索(99%的人都不知道)

    摘要:划重点,这是一道面试必考题,我靠这道题刷掉了多少面试者嘿嘿首先这是一道非常棒的面试题,可以考察面试者的很多方面,比如基本功,代码能力,逻辑能力,而且进可攻,退可守,针对不同级别的人可以考察不同难度,比如漂亮妹子就出题,要是个帅哥那就得上了, 划重点,这是一道面试必考题,我靠这道题刷掉了多少面试者✧(≖ ◡ ≖✿)嘿嘿 首先这是一道非常棒的面试题,可以考察面试者的很多方面,比如基本功,代...

    qingshanli1988 评论0 收藏0
  • 浅谈JS的浅拷贝拷贝(递归和树遍历)

    摘要:对象的特殊性因为对象的是通过指针仔细内存地址的,所以对象的拷贝不能像变量一般简单的赋值,对象的赋值只是将指针的地址赋值过去而已,修改属性值会对所有指向这个内存地址的对象的属性值都会被改变,见下面的例子变量赋值修改不会对造成影响对象赋值修改会 1.对象的特殊性 因为对象的是通过指针仔细内存地址的,所以对象的拷贝不能像变量一般简单的赋值,对象的赋值只是将指针的地址赋值过去而已,修改属性值会...

    cjie 评论0 收藏0
  • js 中二叉树的遍历广度遍历(递归实现与非递归实现)

    摘要:树中结点的最大层次称为树的深度或高度。二叉树有深度遍历和广度遍历,深度遍历有前序中序和后序三种遍历方法。二叉树的前序遍历可以用来显示目录结构等中序遍历可以实现表达式树,在编译器底层很有用后序遍历可以用来实现计算目录内的文件及其信息等。 树的简介 栈、队列、链表等数据结构,都是顺序数据结构。而树是非顺序数据结构。树型结构是一类非常重要的非线性结构。直观地,树型结构是以分支关系定义的层次结...

    Yuanf 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<