判断两个值是否相等(原始值和数组,对象类型)

// 判断两个值是否相等
export default function isEqual(obj1, obj2) {
  const obj1Type = checkType(obj1);
  const obj2Type = checkType(obj2);
  // 首先判断是否类型相同
  if (obj1Type !== obj2Type) {
    return false;
  }
  if (obj1Type === "array") {  // 注意: 数组需要考虑顺序,如果顺序不同,数组不同
    if (obj1.length !== obj2.length) {
      return false;
    } else { // 注意: 需要考虑多维数组和数组的项是对象类型等
      return obj1.every((item,index) => isEqual(item, obj2[index]));
    }
  } 
  if (obj1Type === "object") { // 对象本身无序,不需要考虑顺序
    const obj1Keys = Object.keys(obj1);
    const obj2Keys = Object.keys(obj2);
    if (obj1Keys.length !== obj2Keys.length) {
      return false;
    } else { // 注意:需要考虑对象嵌套情况
      const newSetObj2Keys = new Set(obj2Keys)
      for (let i in obj1) {
        if (obj1.hasOwnProperty(i)) {
          if (!newSetObj2Keys.has(i)) return false;
          if (!isEqual(obj1[i], obj2[i])) return false;
        }    
      }
      return true;
    }
  }
  return Object.is(obj1, obj2);
}

export function checkType(data) {
  return Object.prototype.toString.call(data).toLowerCase().slice(8, -1);
}

 

posted @ 2019-03-04 18:59  Lyra李  阅读(826)  评论(0编辑  收藏  举报