码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-01-23 23:20:44      阅读:262      评论:0      收藏:0      [点我收藏+]

标签:const   构造   style   ops   bsp   cti   rip   func   clone   

深度拷贝

代码如下:

    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算法之深度拷贝和深度比较

标签:const   构造   style   ops   bsp   cti   rip   func   clone   

原文地址:https://www.cnblogs.com/fanzhanxiang/p/10311834.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!