写了个javascript对比对象是否一样的方法,可以适用复杂数据类型。

252 阅读1分钟

网上找了几个方法最后还是自己写一个。

Object.prototype.toString(); 这个方法用来判断数据类型很适用,决定使用这个来写。

/**
 *
 * @param obj1 <any>
 * @param obj2 <any>
 */
function compare2Obj(obj1, obj2) {
  const objToStr = Object.prototype.toString;
  if (obj1 === obj2) { 
    return true;
  } else if (objToStr.call(obj1) === '[object Object]' && objToStr.call(obj2) === '[object Object]') { // 对象
    let keys1 = Object.keys(obj1);
    let keys2 = Object.keys(obj2);
    if (keys1.length !== keys2.length) {
      return false;
    } else {
      for (let i = 0; i < keys1.length; i++) {
        let value1 = obj1[keys1[i]];
        let value2 = obj2[keys1[i]];
        if (!compare2Obj(value1, value2)) {
          return false;
        }
      }
      return true;
    }
  } else if (objToStr.call(obj1) === '[object Array]' && objToStr.call(obj2) === '[object Array]') { // 数组
    if (obj1.length === obj2.length) {
      for (var arrIndex = 0, hasTheSame = false; arrIndex < obj1.length; arrIndex++) {
        hasTheSame = false;
        for (let j = arrIndex; j < obj2.length; j++) {
          if (compare2Obj(obj1[arrIndex], obj2[j])) {
            if (arrIndex !== j) {
              obj2.splice(arrIndex, 0, obj2.splice(j, 1));
            }
            hasTheSame = true;
            break;
          }
        }
        if (!hasTheSame) {
          return false;
        }
      }
      return true;
    } else {
      return false;
    }
  } else {
    return false;
  }
}

上面代码没有对对象的方法,原型的属性方法等做判断。但是对于判断数据对象是否一样基本够用了。

如有不足,还请指正