编辑代码

function hasCircularDependency(config) {
    const visited = new Set(); 
    const checked = new Set(); 

    for (const node of Object.keys(config)) {
        if (checked.has(node)) continue;
        const stack = [[node, new Set([node])]]; 

        while (stack.length > 0) {
            const [current, path] = stack.pop();
            const deps = config[current].deps;

            for (const dep of deps) {
                if (path.has(dep)) {
                    return true; 
                }
                if (!checked.has(dep) && !visited.has(dep)) {
                    const newPath = new Set(path);
                    newPath.add(dep);
                    stack.push([dep, newPath]);
                    visited.add(dep);
                }
            }

            checked.add(current);
            visited.delete(current);
        }
    }

    return false;
}

// 测试用例
console.log(hasCircularDependency({ "A": { deps: [] } })); // false
console.log(hasCircularDependency({ "A": { deps: ["A"] } })); // true
console.log(hasCircularDependency({
    "A": { deps: ["B"] },
    "B": { deps: ["A"] }
})); // true
console.log(hasCircularDependency({
    "A": { deps: ["B"] },
    "B": { deps: ["C"] },
    "C": { deps: ["A"] }
})); // true
console.log(hasCircularDependency({
    "A": { deps: ["B", "C"] },
    "B": { deps: [] },
    "C": { deps: [] }
})); // false