js算法之深度拷贝和深度比较

Posted fanzhanxiang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了js算法之深度拷贝和深度比较相关的知识,希望对你有一定的参考价值。

深度拷贝

代码如下:

    function clone(obj) {
        if(obj == null || typeof obj !== ‘object‘) return obj
        // new obj.constructor() 这里表示返回obj对应的构造函数,如果obj是一个数组则返回一个空数组,如果obj是一个对象则返回一个空对象
        // const newObj = new obj.constructor()
        let newObj = null
        // 时间对象有特殊性
        if(obj.constructor === Date) {
            newObj = new obj.constructor(obj)
        }else{
            newObj= obj.constructor()
        }
        // Object.getOwnPropertyDescriptors(obj) 保证obj里面的成员不在原型链上面
        for(let key in Object.getOwnPropertyDescriptors(obj)) {
            // clone这个方法返回的是if(obj == null || typeof obj !== ‘object‘) return obj这行代码
            newObj[key] = clone(obj[key])
        }
        // 下面这行代码是最后执行的,因为一个方法在return之后这个方法就不会执行了
        return newObj
    }
    let obj = {1:1,2:2,3:3,4:{a:12}}
    console.log(clone(obj))//->{ ‘1‘: 1, ‘2‘: 2, ‘3‘: 3, ‘4‘: { a: 12 } }

深度比较

代码如下所示:

    function deepCompare(a,b) {
        // typeof null也是object,所以这里需要将null和object联合起来判断
        if(a === null || typeof a !== ‘object‘ || b === null || typeof b!== ‘object‘) {
            return a === b
        }
        const propsA = Object.getOwnPropertyDescriptors(a)
        const propsB = Object.getOwnPropertyDescriptors(b)
        if(Object.keys(propsA).length !== Object.keys(propsB).length) {
            return false
        }
        // 数组every函数的用法是数组的每一项都满足every里面的条件
        return Object.keys(propsA).every(
            //  deepCompare(a[key],b[key])这里进行递归的比较,分别比较a和b的每一项
            //  相当于又执行到了if(a === null || typeof a !== ‘object‘ || b === null || typeof b!== ‘object‘) {return a === b}
            //  这行代码
            key => deepCompare(a[key],b[key])
        )
    }
    // console.log(Object.keys({a:1,b:3})) //->[ ‘a‘, ‘b‘ ]
    // console.log(deepCompare({a:1,b:3},{a:1,b:3})) //->true
    // console.log(deepCompare({a:1,b:3},{a:1,b:4})) //->false

 

以上是关于js算法之深度拷贝和深度比较的主要内容,如果未能解决你的问题,请参考以下文章

深度学习框架之Caffe源码解析

算法热门:深度拷贝带随机指针的链表(LeetCode 138)

js变量深度拷贝

系统入门深度学习,直击算法工程师m

JS中实现深度拷贝,复制一个对象

Js深度克隆解析