手写深度比较

38 阅读1分钟

思路

通常需要进行深度比较的是对象,方法一般不需要。

思路要点:

obj1obj2为例:

  1. 先判断obj1``obj2是否是对象,若其中一个不是对象或者两个都不是对象,直接进行obj1===obj2的判断,若两者都是对象,进行步骤2
  2. obj1, obj2都是对象,直接进行obj1===obj2,若相等,返回true,否则进行第三步
  3. 判断obj1 , obj2keys长度是否相等,若不相等,直接返回false,相等则进行第四步
  4. obj1进行循环对比,采取递归的思路,若比较过程中返回了false,则整个函数直接返回false
  5. 若遍历结束,都没返回false,直接返回true.

代码实现

//判断是否是对象
function isObject(obj) {
  return typeof obj === "object" && obj != null;
}

//深度比较函数:isQual
function isQual(obj1, obj2) {
  //判断obj1和obj2是否式对象,若不是则直接===比较
  if (!isObject(obj1) || !isObject(obj2)) {
    return obj1 === obj2;
  }

  //直接判断obj1===obj2
  if (obj1 === obj2) {
    return true;
  }

  //判断obj1和obj2的长度是否相等
  let obj1Keys = Object.keys(obj1),
    obj2Keys = Object.keys(obj2);
  if (obj1Keys.length !== obj2Keys.length) return false;

  //遍历对象,进行判断

  for (let key in obj1) {
    const res = isQual(obj1[key], obj2[key]);
    if (!res) {
      return false;
    }
  }

  return true;
}


//定义a,b对象
let a = {
  a: 1,
  b: {
    c: 2,
    d: {
      e: 10,
    },
  },
};

let b = {
  r: 1,
  b: {
    c: 2,
    d: {
      e: 20,
    },
  },
};

//调用
let c=[1,[2,[3,[4]]],5]
let d=[1,[2,[3,[4]]],6]

console.log(isQual(a, b));
console.log(isQual(c, d));

结果

image.png

总结

深度比较 主要比较的是对象数组,上述代码可以满足对象数组的比较。