js 判断两个对象是否内容相等

541 阅读1分钟

1.===判断

使用 a=== b 完全比较,只能判断同一个引用的对象。内容一样的对象不能判断出来

let a = {name:'aa',age:10}
let b = {name:'aa',age:10}
let c = a

a === c //true 同一个内存引用地址
a === b //false 不同的堆数据

2.JSON.stringify()转化

JSON.stringify(a) === JSON.stirngify(b) ,只能是属性顺序一致的对象,有函数的情况也不能转字符串。

let a = {name:'aa',age:10}
let b = {name:'aa',age:10} 

JSON.stringify(a) === JSON.stirngify(b)  //true 

let a = {name:'aa',age:10}
let b = {age:10,name:'aa'} 
JSON.stringify(a) === JSON.stirngify(b)   //false 序列化的内容顺序不一样

3.代码遍历判断

3.1 单层处理

let a = {name:'aa',age:10}
let b = {name:'aa',age:10} 

function compare(a,b) {
    const aKeys = Object.keys(a)
    const bKeys = Object.keys(b)
    if(aKeys.length !== bKeys.length) {
        return false
    }

    for (let index = 0; index < aKeys.length; index++) {
        const akey = aKeys[index] 
        if(a[akey] !== b[akey] ){
            return false
        }
    } 
    return true
}
console.log(compare(a,b)) 

3.2 单层+对象 递归处理

let a = {name:'aa', c:{d:1} , age:10}
let b = {age:10,name:'aa', c:{d:1} } 

function compareDeep(a,b) {
    const aKeys = Object.keys(a)
    const bKeys = Object.keys(b)
    if(aKeys.length !== bKeys.length) {
        return false
    } 
    for (let index = 0; index < aKeys.length; index++) {
        const akey = aKeys[index] 
      
        if(typeof a[akey] === 'object') {
            if(!compareDeep(a[akey],b[akey])){
                return false
            }  
        }else {
            if(a[akey] !== b[akey] ){
                return false
            }
        } 
    } 
    return true
}
 console.log(compareDeep(a,b)) 

3.3 函数 数组 对象 递归都处理



let a = {name:'aa', c:{d:1} , age:10 , d(params) {},arr:[1,2]}
let b = { name:'aa',age:10,  c:{d:1} , d(params) {},arr:[1,2]} 

function compareDeepAll(a,b) {
    const aKeys = Object.keys(a)
    const bKeys = Object.keys(b)  
    if (aKeys.length !== bKeys.length) {
        return false
    } 
    for (let index = 0; index < aKeys.length; index++) {
        const akey = aKeys[index] 
        if(Object.prototype.toString.call(a[akey]) === '[object Array]'){ //处理数组的情况
            if(a[akey].length !== b[akey].length) {
                return false
            } 
            let flag = a[akey].every((o,arrIndex) => {
                if(typeof o === 'object' || typeof o === 'function' ){
                    if (!compareDeepAll(a[akey][arrIndex],b[akey][arrIndex])){
                        return false
                    }  
                }else{
                    if (a[akey][arrIndex] !== b[akey][arrIndex]) {
                        return false
                    } 
                }
                return true
            })
            if(flag == false) {
                return false
            }
        }
        else if(typeof a[akey] === 'object') {
            if (!compareDeepAll(a[akey],b[akey])){
                return false
            }  
        }else if(typeof a[akey] === 'function' ){
            if (JSON.stringify(a[akey])  !== JSON.stringify(b[akey])){
                return false
            }
        }else {
            if (a[akey] !== b[akey]) {
                return false
            } 
        }
    } 
    return true
}
 console.log(compareDeepAll(a,b))