zoukankan      html  css  js  c++  java
  • 深拷贝

    function clone(source) {
        var target = {};
        for(var i in source) {
            if (source.hasOwnProperty(i)) {
                if (typeof source[i] === 'object') {
                    target[i] = clone(source[i]); // 注意这里
                } else {
                    target[i] = source[i];
                }
            }
        }
    
        return target;
    }
    function createData(deep, breadth) {
        var data = {};
        var temp = data;
    
        for (var i = 0; i < deep; i++) {
            temp = temp['data'] = {};
            for (var j = 0; j < breadth; j++) {
                temp[j] = j;
            }
        }
    
        return data;
    }
    
    createData(1, 3); // 1层深度,每层有3个数据 {data: {0: 0, 1: 1, 2: 2}}
    createData(3, 0); // 3层深度,每层有0个数据 {data: {data: {data: {}}}}

    用循环遍历一棵树,需要借助一个栈,当栈为空时就遍历完了,栈里面存储下一个需要拷贝的节点

    首先我们往栈里放入种子数据,key用来存储放哪一个父元素的那一个子元素拷贝对象

    然后遍历当前节点下的子元素,如果是对象就放到栈里,否则直接拷贝

    function cloneLoop(x) {
        const root = {};
    
        //
        const loopList = [
            {
                parent: root,
                key: undefined,
                data: x,
            }
        ];
        
        while(loopList.length) {
            // 深度优先
            const node = loopList.pop();
            const parent = node.parent;
            const key = node.key;
            const data = node.data;
    
            // 初始化赋值目标,key为undefined则拷贝到父元素,否则拷贝到子元素
            let res = parent;
            if (typeof key !== 'undefined') {
                res = parent[key] = {};
            }
    
            for(let k in data) {
                if (data.hasOwnProperty(k)) {
                    if (typeof data[k] === 'object') {
                        // 下一次循环
                        loopList.push({
                            parent: res,
                            key: k,
                            data: data[k],
                        });
                    } else {
                        res[k] = data[k];
                    }
                }
            }
        }
        return root;
    }
  • 相关阅读:
    在java中获取URL的域名或IP与端口
    解决notepad++64位没有plugin manager的问题
    统一认证需要解决的问题
    搭建Maven私服
    Update openssh7.9 on centos6
    python下载想听的有声书,让喜马拉雅收费,我是程序员!
    golang ---获取内存信息
    websocket学习
    go 读取BMP文件头二进制读取
    go 计算文件行
  • 原文地址:https://www.cnblogs.com/rusr/p/9953514.html
Copyright © 2011-2022 走看看