手写 判断对象是否存在循环引用qaq

172 阅读1分钟
  • 循环引用对象在序列化的时候就会发生问题

    • 调用JSON.stringify()对该类对象进行序列化,就会报错: Converting circular structure to JSON.
const isCycleObject = (obj, parent) => {
  // parentArr用于存储每个对象的父级对象,初始化时将当前对象添加为第一个父级对象
  const parentArr = parent || [obj]

  for (let i in obj) {
    if (typeof obj[i] === 'object') {
      let flag = false

      // 检查当前对象是否已经在父级数组中存在,如果存在则表示存在循环引用
      parentArr.forEach((pObj) => {
        if (pObj === obj[i]) {
          flag = true
        }
      })

      if (flag) return true

      // 递归调用isCycleObject函数判断当前对象的属性是否存在循环引用
      flag = isCycleObject(obj[i], [...parentArr, obj[i]])

      if (flag) return true
    }
  }

  // 遍历完所有属性后,未找到循环引用则返回false
  return false
}

const a = 1
const b = { a }
const c = { b }
const o = { d: { a: 3 }, c }
o.c.b.aa = a

console.log(isCycleObject(o))