教你徒手写深浅克隆

1.浅克隆,简单粗暴,这里有三种方法

//1.直接赋值
  var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
  var o = {};
//2.遍历
  var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
  var o2 = {};
        for (var k in obj) {
            // k 是属性名   obj[k] 属性值
            o2[k] = obj[k];
        };
//3.方法
  var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18
            }
        };
   Object.assign(o, obj);

2.0深克隆,利用递归

 var obj = {
            id: 1,
            name: 'andy',
            msg: {
                age: 18,
                sex: 'man'
            },
            color: ['pink', 'red']
        };
        var o = {};
    // 封装函数 
        function deepCopy(newobj, oldobj) {
            for (var k in oldobj) {
                // 判断我们的属性值属于那种数据类型
                // 1. 获取属性值  oldobj[k]
                var item = oldobj[k];
                // 2. 判断这个值是否是数组
                if (item instanceof Array) {
                    newobj[k] = [];
                    deepCopy(newobj[k], item)
                } else if (item instanceof Object) {
                    // 3. 判断这个值是否是对象
                    newobj[k] = {};
                    deepCopy(newobj[k], item)
                } else {
                    // 4. 属于简单数据类型
                    newobj[k] = item;
                }
            }
        }
        deepCopy(o, obj);

2.1深克隆,利用JSON转换

//深拷贝
function deepClone(data) {
    let _data = JSON.stringify(data),
        dataClone = JSON.parse(_data);
    return dataClone;
};

2.2深克隆,

//深拷贝
 function clone(o) {
            var temp = {}
            for (var key in o) {
                if (typeof o[key] == 'object') {
                    temp[key] = clone(o[key])
                } else {
                    temp[key] = o[key]
                }
            }
            return temp
        }

3.0树形结构的克隆修改key

        let tree = [
            {
                id: '1',
                title: '节点1',
                children: [
                    {
                        id: '1-1',
                        title: '节点1-1'
                    },
                    {
                        id: '1-2',
                        title: '节点1-2'
                    }
                ]
            },
            {
                id: '2',
                title: '节点2',
                children: [
                    {
                        id: '2-1',
                        title: '节点2-1',
                        children: [
                            {
                                id: '3-1',
                                title: '节点3-1',
                                children: []
                            }
                        ]
                    }
                ]
            }
        ]
        let newTree = [];
        handleTree(newTree, tree)
        console.log(newTree, 'newTree');
        function handleTree(newTree, oldTree) {
            for (let i = 0; i < oldTree.length; i++) {
                newTree[i] = {};
                for (const key in oldTree[i]) {
                    if (key == 'children' && oldTree[i].children.length > 0) {
                        newTree[i][key + "s"] = [];
                        handleTree(newTree[i][key + "s"], oldTree[i].children)
                    } else {
                        if (Object.hasOwnProperty.call(oldTree[i], key)) {
                            const element = oldTree[i][key];
                            if (key == "id") {
                                // console.log(newTree[i]);
                                newTree[i]["ids"] = element
                            } else if (key == 'title') {
                                newTree[i]["titles"] = element
                            }
                        }
                    }
                }
            }
        }

版权声明:本文为songJunFeng1原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
THE END
< <上一篇
下一篇>>