手写一个对比两个对象数据是否相等的方法

15 阅读1分钟

面试时有一个题目,手写一个对比两个对象是否相同的方法 题目是:

const a = {}
const b = {} as any
const c = {}
const d = {}
const fn = () => {
  return 1
}

;[a, b, c, d].forEach((item: any) => {
  // item.a = 1
  // item.b = 2
  // item.c = 3
  // item.d = 4
  item.a = a
  item.b = b
  item.c = c
  item.d = d
  item.fn = fn
})

const isEqual = (d1: any, d2: any) => {
  // coding
}

b.name = 2
console.log('is equal 1', isEqual(a, b))

console.log('is equal 2', isEqual(c, d))

题目中涉及到循环引用,下面是我实现的,经测试正常


const isEqual = (d1: any, d2: any) => {
  let layMap = new WeakMap()
  const isObject = (data: any) => {
    return data instanceof Object
  }

  const dataType = (data: any) => {
    return Object.prototype.toString.call(data)
  }

  if (!isObject(d1) || !isObject(d2)) {
    return d1 === d2
  }

  if (Object.keys(d1).length != Object.keys(d2).length) {
    return false
  }

  if (dataType(d1) != dataType(d2)) {
    return false
  }

  for (let key in d1) {
    // if (dataType(d1[key]) != dataType(d2[key])) {
    //   return false;
    // }
    layMap.set(d1[key], d1[key])
    if (!layMap.has(d2[key])) {
      if (!isEqual(d1[key], d2[key])) {
        return false
      }
    }
  }

  // test
  return true
}