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

标签 javascript angularjs json algorithm circular-dependency

我有一个像这样的 json 对象:

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 失败。 我已经做了足够的谷歌和搜索来获得解决方案,但找不到太多帮助。

所以这里基本上我想检测 json 对象中的循环依赖关系,并向该对象添加一个新键,表示 circular: 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: []
                }
            ]
        }
    ]
}

有一种方法,我认为可以解决这个问题,我可以循环遍历所有子级,除非没有子级达到最大 2 级,但这样我会错过深度超过 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) 

这会导致传递的原始对象发生更改。

希望这有帮助!

关于javascript - 识别 Json 对象中的循环依赖并删除 2 深度后的所有元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49883894/

相关文章:

javascript - 使用 jquery 使用 twig 值填充输入字段

javascript - 如何按顺序使用 RxJS observables?

php - GitHub API 提交

javascript - 复选框标签在 Angularjs 中无法正常工作

Javascript 为 jQuery AJAX 创建 JSON 哈希数组

jQuery AJAX 访问 REST API JSON 数据

javascript - Web Api C# .net 参数 POST

javascript - 如何更改jspdf中的线条颜色?

angularjs - 如何在 Angular JS 中的 ng-repeat 中创建小计

javascript - 空数组中的 Angular 推送项