深度优先和广度优先实现深拷贝

抽取方法

	function getEmpty(o) {
        if(Object.prototype.toString.call(o) === '[object Object]'){
            return {};
        }
        if(Object.prototype.toString.call(o) === '[object Array]'){
            return [];
        }
        return o;
    }

深度优先

	function deepCopyDFS(origin){
        var target = getEmpty(origin);
        if(target !== origin){
            for(let key in origin){
                target[key] = deepCopyDFS(origin[key]);
            }
        }
        return target;
    }

广度优先

	function deepCopyBFS(origin) {
        let queue = [];
        // let map = new Map();

        let target = getEmpty(origin);
        if(target !== origin){
            queue.push([origin, target]);
            // map.set(origin, target)
        }
        while(queue.length) {
            let [ori, tar] = queue.shift();
            for(let key in ori) {
                //处理环状
                // if(map.get(ori[key])){
                //     tar[key] = map.get(ori[key]);
                //     continue;
                // }
                tar[key] = getEmpty(ori[key]);
                if(tar[key] !== ori[key]){
                    queue.push([ori[key], tar[key]]);
                    // map.set(ori[key], tar[key])
                }
            }
        }
        return target;
    }

测试代码:

	var a = {
        reg: /^[a-z][0-9]$/,
        fn: () => {
            console.log("I am a function");
        },
        array: [1,2,3,4],
        string: 'I am a string'
    }
    //const b = JSON.parse(JSON.stringify(a)) //存在问题
    const b = deepClone(a); 
    a.array[0] = 6;
    console.log(a, b);
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值