欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

测试检查两个对象的属性值是否相同(不只判断相等)

程序员文章站 2022-04-09 20:42:05
...

通常情况下JS要 obj1 === obj2 是检查两个变量所指向的对象是否相同,如果我们要检查两个不同的对象的所有属性值是否相等,用obj1 === obj2是不行的,这个时候就要遍历两个对象的所有属性是否相等,遇到对象属性是数组或者对象的情况就需要进行递归检查,上代码:

testObjSame (obj1, obj2) {
     // debugger
      if (obj1 === obj2) {// 常规情况
        return true
      }
    //  对象转json字符对比相同则肯定对象值相同这里可以过滤大部分情况
      if (JSON.stringify(obj1) === JSON.stringify(obj2)) {
        return true
      }
      const keys1 = Object.keys(obj1)
      const keys2 = Object.keys(obj2)
      if (keys1.length !== keys2.length) {// 属性字段列表长度不一致则肯定不相同
        return false
      }
      const kset = new Set([...keys1, ...keys2])
      const keys3 = Array.from(kset)// 长度相同的情况下取并集
      if (keys3.length !== keys2.length) {// 并集多于或者少于原始的则对象不相同
        return false
      }
      // 遍历属性
      for (let i = 0; i < keys3.length; i++) {
        const k = keys3[i];
        const o1 = obj1[k]
        const o2 = obj2[k]
        // 如果是对象(数组也是对象)则递归判断,这里没有考虑function的情况
        if (typeof o1 === 'object' && typeof o2 === 'object') {
          if (!testObjSame(o1, o2)) {
            return false
          }
        } else if (o1 !== o2) {
          return false
        }
      }
      return true
    }

测试:

const d = testObjSame({ a: 1, b: [{ a: 1, b: 2 }] }, { b: [{ b: 2, a: 2 }], a: 1 })
    console.log(d)
    const d2 = testObjSame({ a: 1, b: [{ a: 1, b: 2 }] }, { a: 1, b: [{ a: 1, b: 2 }] })
    console.log(d2)

未经严格测试,如有错误请留言。