识别 Json object 中的循环依赖并删除 2 深度后的所有元素

Identify circular dependency in a Json object and remove all element after 2 depth

我有一个 json object 是这样的:

var temp1 = {
    name: "AMC",
    children: [
        {
            name: "cde",
            children: [
                {
                    name: "AMC",
                    children: [
                        {
                            name: "cde",
                            children: [
                                {
                                    name: "AMC",
                                    children: [
                                        //.............. continues as curcular depndency
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        },
        {
            name: "mnp",
            children: [
                {
                    name: "xyz",
                    children: []
                }
            ]
        }
    ]
}

由于这种特定的依赖性,JSON.stringify 失败了。 我已经做了足够多的 google 并正在寻找解决方案,但找不到太多帮助。

所以在这里基本上我想检测 json object 中的循环依赖并向 object 添加一个新键,说 cricular: true 并删除所有后续节点.

所以这是我正在寻找的结果输出:

var temp1 = {
    name: "AMC",
    children: [
        {
            name: "cde",
            circular: true,
            children: [ // No children here as it is curcular dependency
            ]
        },
        {
            name: "mnp",
            children: [
                {
                    name: "xyz",
                    children: []
                }
            ]
        }
    ]
}

有一种方法,我认为可以解决它,我可以循环遍历所有 children 除非没有 children 最多 2 个级别,但那样我会错过有效children 深度超过 3。

我希望我的问题很清楚。如果没有,请告诉我,我会尝试进一步扩展。

一个递归函数解决了这个问题:

function check(stack,parent, obj){
    stack = stack || []; //stack contains a list of all previously occurred names
    var found = stack.find(function(parent){
        return (parent==obj.name && obj.children.length>0); //checks to see if the current object name matches any in the stack.
    });
    if(!found && obj.children.length>0){
        stack.push(obj.name); //adds the current object name to the list.
        obj.children.forEach(function(child){
            check(stack,obj, child);//recursively checks for all children.
        })
    }
    else if(found){
        parent.children=[];
        parent.circular=true;
        stack.pop(obj.name);
        return;
    }
    else{
        return;
    }
}
check([],temp1, temp1) 

这会导致传递的原始对象发生变化。

希望对您有所帮助!

使用console.table(circularObj) 帮助您进行调试