Skip to content

检测对象循环引用

递归

js
function isObject(value) {
  return (
    (typeof value === "object" && value !== null) || typeof value === "function"
  );
}

function detectCycle(value, seen = new Set()) {
  if (!isObject(value)) {
    return false;
  }
  if (seen.has(value)) {
    return true;
  }
  for (const key in value) {
    if (value.hasOwnProperty(key)) {
      const val = value[key];
      if (detectCycle(val, seen)) {
        return true;
      }
    }
  }
  return false;
}

把对象转换为一颗多叉树,边是 key,节点是 value,如果树中有环,说明对象存在循环引用。

  • DFS
  • 拓扑排序
  • 并查集