JavaScript管理循环

JavaScript管理循环,javascript,arrays,loops,recursion,filter,Javascript,Arrays,Loops,Recursion,Filter,我创建了一个脚本,它接收字符串数组并过滤一个重复的自由单个字符串 const a = [ "Leetmeme: Cyberportal", "Cyberportal: Ice,Fraudstream", "CamelCaser: KittenService", "Fraudstream: Leetmeme", "KittenService:", "Ice:" ]; //transforming `a` into a reasonable stru

我创建了一个脚本,它接收字符串数组并过滤一个重复的自由单个字符串

const a = [
    "Leetmeme: Cyberportal",
    "Cyberportal: Ice,Fraudstream",
    "CamelCaser: KittenService",
    "Fraudstream: Leetmeme",
    "KittenService:",
    "Ice:"
];

//transforming `a` into a reasonable structure
let identity = v => v;
let dependencies = a.reduce((acc, str) => {
    let [key, ...deps] = str.split(/[:,]\s*/g).filter(identity);
    acc[key] = deps;
    return acc
}, {});

let depth = 0; //just for logging
let status = {};
let load = (acc, module) => {
    if(status[module] === "loading"){
        var circle = Object.keys(status).filter(k => status[k] === "loading").concat(module);
        throw new Error("circular reference found: " + circle);
    }

    if(status[module] !== "done"){
        console.log("  ".repeat(depth++), module);
        status[module] = "loading";
        let deps = dependencies[module] || [];
        deps.reduce(load, acc).push(module);
        status[module] = "done";
        --depth;
    }
    return acc;
}

let order = Object.keys(dependencies).reduce(load, []);
console.log(order);