(工具类)判断两个对象是否相同

通过递归的方式判断两个对象是否相同

function isObject(obj){
  return obj !== null && typeof obj === "object";
};
// 对比两个对象是否相同
export const looseEqual = (a, b) => {
  if (a === b) {
    //如果是绝对相等就直接返回true
    return true;
  }
  //如果不是绝对相等就哦按的他们是否有相同的形状
  let isObjectA = isObject(a);
  let isObjectB = isObject(b);
  if (isObjectA && isObjectB) {
    //两个均是对象
    try {
      let isArrayA = Array.isArray(a);
      let isArrayB = Array.isArray(b);
      if (isArrayA && isArrayB) {
        //如果都是数组
        if (a.length === b.length) {
          //如果长度相等
          return a.every((e, i) => {
            //用every和递归来比对a数组和b数组的每个元素,并返回
            return looseEqual(e, b[i]);
          });
        }
        //长度都不等直接返回false
        return false;
      } else if (a instanceof Date && b instanceof Date) {
        //如果是Date 则直接getTime 比较
        return a.getTime() === b.getTime();
      } else if (!isArrayA && !isArrayB) {
        //对象的比较
        //拿到两个对象的key
        let keysA = Object.keys(a);
        let keysB = Object.keys(b);
        if (keysA.length === keysB.length) {
          //如果keys相等
          return keysA.every((key) => {
            //用every和递归来比对a对象和b对象的每个元素值,并返回
            return looseEqual(a[key], b[key]);
          });
        }
        //长度都不等直接返回false
        return false;
      } else {
        return false;
      }
    } catch (e) {
      return false;
    }
  } else if (!isObjectA && !isObjectB) {
    //如果都不是对象则按String来处理
    return String(a) === String(b);
  } else {
    return false;
  }
};

猜你喜欢

转载自blog.csdn.net/weixin_43742167/article/details/129357106