美文网首页
判断两个对象是否相等

判断两个对象是否相等

作者: 飞飞廉 | 来源:发表于2018-03-11 19:19 被阅读0次

由于对象是引用类型,即使内容一摸一样的两个对象,判断他们是否相等也是不等的,他们是存在不同地址中的相同内容,是不相等的;只有通过赋值,两个对象指向的是同一个地址,同一个内容,这样才相等。


image.png

那js中判断对象是否相等的方法有哪些呢?

  • JSON.stringify()
    首先,我们可以通过将对象通过JSON.stringify()方法将对象转换成字符串,然后再比较
    局限性:
    如果对象里属性的位置发生变化,转换来的字符串就不相等,但实际我们只需要看他们的内容是否一致,与顺序没有关系,所以这种方法有局限性。
  • 通用方法:
function equals(x,y){
    var f1=x instanceof Object;
    var f2=y instanceof Object;
    if(!f1 || !f2){
        return x===y
    }
    if(Object.keys(x).length!== Object.keys(y).length){
        return false
    }
    for(var p in x){
        var a= x[p] instanceof Object; 
        var b= y[p] instanceof Object; 
        if(a && b){
            equals(x[p],y[p])
        }else if(x[p]!=y[p]){
            return false;
        }
    }
      return true;
}
console.log(equals({a:1,b:2},{a:1,b:{c:4}}))

首先判断是不是引用类型的,如果有一个不是,那就进行直接判断。
若全是引用类型的,那就先看一下属性值的长度是否相等,若不相等,就直接false啦。
若相等,就接着遍历里边的每一个属性,还是先看里边的属性是哪一个类型,如果全是引用类型,那就接着对里边的属性调用equals递归函数。如果不全是引用类型,那就比较这两个值是否相等,若不相等就直接false啦。
若遍历一圈下来都没有返回false,说明都相等啦。所以返回true。

注意,最好不要用forin循环,因为他会遍历原型链所有的可枚举属性,而
function equals(x,y){
    var f1=x instanceof Object;
    var f2=y instanceof Object;
    if(!f1 || !f2){
        return x===y
    }
    if(Object.keys(x).length!== Object.keys(y).length){
        return false
    }
    Object.keys(x).forEach((p)=>{
        var a= x[p] instanceof Object; 
        var b= y[p] instanceof Object; 
        console.log(y[p])
        if(a && b){
            equals(x[p],y[p])
        }else if(x[p]!=y[p]){
            return false;
        }

    })
      return true;
    
}

但是forEach里的return不会终止循环,所以还是不用forEach了,

function equals(x, y) {
        var f1 = x instanceof Object;
        var f2 = y instanceof Object;
        if (!f1 || !f2) {
            return x === y
        }
        if (Object.keys(x).length !== Object.keys(y).length) {
            return false
        }
        var newX = Object.keys(x);
        for (var p in newX) {
            p = newX[p];
            var a = x[p] instanceof Object;
            var b = y[p] instanceof Object;
            if (a && b) {
                equals(x[p], y[p])
            } else if (x[p] != y[p]) {
                return false;
            }
        }
        return true;

    }
    console.log(equals({ a: 1, b: 2 }, { a: 1, d: 2 }))

相关文章

  • python 高级编程①

    1 ‘==’ 与‘is ’的使用 ① ‘==’判断两个对象内容是否相等 ‘is’判断两个对象的地址是否相等 ②在p...

  • 关于isEqual

    isEqual,用来判断两个对象是否相等。但是,与“==”判断指针地址是否相等,不同的是,它判断的是对象的内容方...

  • JS 判断两个对象是否相等

    判断两个对象是否相等,执行结果:

  • C# 相等比较

    引用相等性 判断两个对象是否引用同一基础对象。使用 ReferenceEquals 方法判断: 值相等性 使用 =...

  • Java中判断两个对象相等,重写equals()方法和hashC

    基本概念 要比较两个对象是否相等时需要调用对象的equals() 方法:判断对象引用所指向的对象地址是否相等 对象...

  • python集合操作

    判断两个list是否相等 判断两个tuple是否相等 判断两个set是否相等 list转set list转tupl...

  • String中equals方法

    Java中使用“==”来判断两个对象是否相等是判断两个对象的引用是否相同Java中使用“equals”来判断两个对...

  • java重写equals方法需要注意

    为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而...

  • iOS 快看漫画面试整理

    1, 如何判断两个对象相等 先判断是否为nil,然后比较对象的地址(用==),然后判断两个对象是否是同一个类(用i...

  • Java基础中Integer值用==和equal判断相等问题

    一、Integer equals()方法判断的是两个Integer对象值是否相等 二、Integer==判断两个对...

网友评论

      本文标题:判断两个对象是否相等

      本文链接:https://www.haomeiwen.com/subject/wnswfftx.html