Js 比較兩個物件的鍵名與鍵值是否相等

不唯有與他人告別發表於2023-03-10

文中還使用了sort函式來排序,這樣做的好處是儘管物件順序不一致也可以比較相等

  let obj = {
        leftDom1: 'rightDom1',
        leftDom2: 'rightDom1',
        leftDom3: 'rightDom3',
        leftDom4: 'rightDom2',
      };
      let obj2 = {
        leftDom2: 'rightDom1',
        leftDom3: 'rightDom3',
        leftDom4: 'rightDom2',
        leftDom1: 'rightDom1',
      };
      function compareObjects(obj1, obj2) {
        const keys1 = Object.keys(obj1).sort();
        const keys2 = Object.keys(obj2).sort();
        if (keys1.length !== keys2.length) {
          return false;
        }
        for (let i = 0; i < keys1.length; i++) {
          if (keys1[i] !== keys2[i] || obj1[keys1[i]] !== obj2[keys2[i]]) {
            return false;
          }
        }

        return true;
      }

      console.log(compareObjects(obj, obj2)); // true

如果有多維物件怎麼辦呢?我們需要進行遞迴一下

   // 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
      function deepCompare(obj1, obj2) {
        if (typeof obj1 !== 'object' || typeof obj2 !== 'object') {
          console.log('obj1 === obj2', obj1 === obj2);
          return obj1 === obj2;
        }
        // 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
        const keys1 = Object.keys(obj1).sort();
        const keys2 = Object.keys(obj2).sort();

        // 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
        if (keys1.length !== keys2.length) return false;

        // 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
        for (let i = 0; i < keys1.length; i++) {
          const key1 = keys1[i];
          const key2 = keys2[i];
          const val1 = obj1[key1];
          const val2 = obj2[key2];

          // 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
          if (key1 !== key2) return false;

          // 如果 obj1 和 obj2 不是物件,則直接比較它們是否相等
          if (!deepCompare(val1, val2)) return false;
        }

        return true;
      }

測試一下

      // 字元與陣列
      const obj1 = ['aaa'];
      const obj2 = 'aaa';
      console.log(deepCompare(obj1, obj2)); // false

      // 字元與字元
      const obj1 = 'aaa';
      const obj2 = 'aaa';
      console.log(deepCompare(obj1, obj2)); // true

    // 物件與物件
      const obj1 = {
        a: {
          b: {
            c: {
              d: 1, //順序不一樣
              e: 2,
            },
          },
        },
      };
      const obj2 = {
        a: {
          b: {
            c: {
              e: 2,
              d: 1,
            },
          },
        },
      };
      console.log(deepCompare(obj1, obj2)); // true

相關文章