识别 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) 帮助您进行调试
我有一个 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) 帮助您进行调试