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

通常情况下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)

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

你可能感兴趣的:(测试检查两个对象的属性值是否相同(不只判断相等))