js对象深度相同

js对象深度相同
  • 什么叫做 对象深度相同 ?,就是 两个对象一模一样,但是又不是同一个对象
  • 举个例子:const p1 = { name:“zhangsan” },p2 = { name:“zhangsan” },p1和p2长得一模一样,但是 因为他们的引用不同,所以不是一个对象,如果你想让他们成为同一个对象也很简单,直接 p1=p2 就可以了,但是 这里要讲的是,如何才能检验两个长得一模一样的对象,但是这两个对象又不是一个对象,就好比双胞胎,长得一模一样但是不是同一个人
  • 之前定义过 深度克隆 deepClone() 函数,现在 自定义一个专门用来检验两个长得一模一样的对象的函数,也就是 深度相同函数,即 deepEqual() 函数
话不多说,直接上代码
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>深度相同</title>
    </head>
    <body>
        <script>
            if(!Object.deepEqual){
                Object.deepEqual = function(o1,o2){
                    const o1Arr = Object.keys(o1)
                    const o2Arr = Object.keys(o2)
                    const len = o1Arr.length
                    if(o1Arr.length === o2Arr.length){
                        for(let i=0;i < len;i++){
                            if(o2.hasOwnProperty(o1Arr[i])){
                                if(Object.prototype.toString.call(o1[o1Arr[i]]) === "[object Object]"){
                                    // 说明这个属性是一个对象
                                    if(!Object.deepEqual(o1[o1Arr[i]],o2[o1Arr[i]])){
                                        return false
                                    }
                                }else{
                                    // 说明属性是一个值,不是一个对象
                                    if(!(o1[o1Arr[i]] === o2[o1Arr[i]])){
                                        // throw new Error("propertyValue different!")
                                        return false
                                    }
                                }
                                
                            }else{
                                // throw new Error("property different!")
                                return false
                            }
                        }
                    }else{
                        // throw new Error("propertyLength different!")
                        return false
                    }
                    return true
                }
            }

            if(!Object.deepClone){
                Object.deepClone = function(target,source){
                    for(let property in source){
                        if(Object.prototype.toString.call(source[property]) === "[object Object]"){
                            target[property] = Object.deepClone({},source[property])
                        }else{
                            target[property] = source[property]
                        }
                    }
                    return target
                }
            }


            const zhangsan = {
                name:"zhansgan",
                gender:"man",
                age:23,
                job:"student",
                hobby:{ name:"basketball" }
            }

            const lisi = Object.deepClone({},zhangsan)
            console.log(lisi)
            // lisi.hobby.name = "football"
            console.log(zhangsan)
            console.log(zhangsan == lisi)
            console.log(Object.deepEqual(zhangsan,lisi))
        </script>
    </body>
</html>
  • 测试结果如图:
    在这里插入图片描述
  • 大功告成…
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值