zoukankan      html  css  js  c++  java
  • JavaScript判断对象是否相等

    实现一、

    var obj = {a:'a'},obj1 = {b:'b'},obj2 = {a:'a'};
    就是使用
    JSON.stringify()
    先把对象转化成字符串,
    这样就可以啦

    console.log(JSON.stringify(obj) == JSON.stringify(obj1));//false
    console.log(JSON.stringify(obj) == JSON.stringify(obj2));//true

    弊端:这样不是很严谨,如果一个对象里是有两个属性的,只是位置不一样而已,这样的方法就是错误的

    var a ={"name":"lsx","age":12};

    var b ={"age":12,"name":"lsx"};

    console.log(JSON.stringify(a) == JSON.stringify(b))

    ------false

    实现二、

    思路
    只要两个对象的名和键值都相同。那么两个对象的内容就相同了

    1.用Object.getOwnPropertyNames拿到对象的所有键名数组
    2.比对键名数组的长度是否相等。否=>false。真=>3
    3.比对键名对应的键值是否相等

     function isObjectValueEqual(a, b) {
            var aProps = Object.getOwnPropertyNames(a);
            var bProps = Object.getOwnPropertyNames(b);
    
            if (aProps.length != bProps.length) {
                return false;
            }
    
            for (var i = 0; i < aProps.length; i++) {
                var propName = aProps[i];
                var propA = a[propName];
                var propB = b[propName];
                if ( propA !== propB) {
                        return false;
                }
            }
            return true;

    弊端:粗略一看没问题,但是细心的同学发现如果 键值也是对象的话,那这个方法就不管用了,比如下面的测试数据

     var a = {
            id:1,
            name:2,
            c:{
                age:3
            }
        };
        var b = {
            id:1,
            name:2,
            c:{
                age:3
            }
        }
        console.log(isObjectValueEqual(a,b));//false

    实现三、

    在实现二的基础上递归实现

    isObjectValueEqual(a, b) {
         var aProps = Object.getOwnPropertyNames(a);
         var bProps = Object.getOwnPropertyNames(b);
          if (aProps.length != bProps.length) {
               return false;
          }
          for (var i = 0; i < aProps.length; i++) {
            var propName = aProps[i]
    
            var propA = a[propName]
            var propB = b[propName]
            if ((typeof (propA) === 'object')) {
              if (this.isObjectValueEqual(propA, propB)) {
                  return true
                } else {
                  return false
                }
            } else if (propA !== propB) {
              return false
            } else { }
          }
        return true
        },

    再次测试:

     var a = {
            id:1,
            name:2,
            c:{
                age:3
            }
        };
        var b = {
            id:1,
            name:2,
            c:{
                age:3
            }
        }
        console.log(isObjectValueEqual(a,b));//true

     【注】、上面三种方式实现三是最靠谱的

  • 相关阅读:
    20200414:mysql原子性和持久性怎么保证
    20200417:说说redis的rdb原理。假设服务器的内存8g,redis父进程占用了6g,子进程fork父进程后,子父进程总共占用内存12g,如何解决内存不足的问题?(挖)
    [九省联考2018]秘密袭击coat
    CF1158F Density of subarrays
    忘情
    [IOI2018] meetings 会议
    [AGC013E] Placing Squares
    [八省联考2018]林克卡特树
    [NOI2016] 国王饮水记
    [十二省联考 2019]皮配
  • 原文地址:https://www.cnblogs.com/yanl55555/p/11990987.html
Copyright © 2011-2022 走看看