每天一点前端知识 - 比较数据是否相同

69 阅读1分钟

实现

const equal = (a, b) => {
  const typeA = getType(a);
  const typeB = getType(b);
  if (typeA !== typeB) {
    return false;
  }
  if (a == null || b == null) {
    return a === b;
  }
  /*if (isEle(a)) {
    return a.isEqualNode(b);
  }*/
  if (['object', 'array'].indexOf(typeA) === -1) {
    return a.toString() === b.toString();
  }
  if (Object.keys(a).length !== Object.keys(b).length) {
    return false;
  }
  if (isCyclic(a) && isCyclic(b)) {
    return equal(a, b);
  }
  for (let k in b) {
    if (hasProp(a, k) !== hasProp(b, k)) {
      return false;
    }
    if (!equal(a[k], b[k])) {
      return false;
    }
  }
  return true;
};

使用

equal(a, b);


示例

const a = {
  num: 12,
  str: 'hello',
  nul: null,
  arr: [
    {
      name: 'a1',
      children: [1, 'hi'],
    },
  ],
  obj: {
    name: 'obj',
    age: 22,
    oa1: [2, null, 'oa1'],
    oa2: {
      name: 'test',
    },
  },
};
const b = {
  num: 12,
  str: 'hello',
  nul: null,
  arr: [
    {
      name: 'a1',
      children: [1, 'hi'],
    },
  ],
  obj: {
    name: 'obj',
    age: 22,
    oa1: [2, null, 'oa1'],
    oa2: {
      name: 'test',
    },
  },
};

equal(a, b);

6.png

演示地址:ihuxy.com/play?utils=…