浅拷贝和深拷贝以及数组去重示例

1.浅拷贝

 var obj1 = {
            name: "lsd",
            age: 25,
            skill: ["Java", "H5", "PHP"],
            wife: {
                name: "wyq",
                age: 24
            }
        }
        var obj2 = {};
        // 浅拷贝只拷贝第一层属性,引用类型数据地址是相同的---因此存在数据共享问题
        // 遍历obj1
        for (var key in obj1) {
            obj2[key] = obj1[key];
        }
        // console.log(obj1);
        // console.log(obj2);

        // 深拷贝---解决数据共享问题
        function deepCopy(source, target) {//source ---数据源 target---目标
            for (var key in source) { //遍历数据源
                if (source.hasOwnProperty(key)) { //只获取source身上的私有属性
                    if (typeof source[key] == "object") {// 如果为true 表示是引用类型数据
                        // console.log(source[key]);
                        // 拷贝引用类型数据
                        target[key] = Array.isArray(source[key]) ? [] : {}; //判断是数组还是对象
                        deepCopy(source[key], target[key]);//递归---对source[key]一层层拷贝
                    } else {
                        // 拷贝值类型数据
                        target[key] = source[key];
                    }
                }
            }
        }
        // 测试
        deepCopy(obj1, obj2);
        console.log(obj1);
        obj2.skill.push("UI");
        console.log(obj2);

测试图示:

 

 2.数组去重

 //数组去重---去除数组中重复的数据
        var arr = [10, 5, 2, 4, 10, 3, 2, 1, 4, 1, "A", "D", "A"];
        function distinctArray(arr) {
            var newArray = [];
            for (var i = 0; i < arr.length; i++) {
                //判断newArray中是否存在当前arr[i]这个数据--不存在则将数据写入newArray
                // indexOf()---数组方法 返回-1表示该数组中没有这个数据
                if (newArray.indexOf(arr[i]) == -1) {
                    newArray.push(arr[i]);//将数据追到到newAray中
                }
            }
            return newArray;
        }
        console.log(distinctArray(arr));

测试图示:

 

posted @ 2020-06-15 13:30  养猪的狗子  阅读(178)  评论(0编辑  收藏  举报