查找“a”的算法;递归的;Javascript数据结构中的项
假设我有一个Javascript数据结构,例如:查找“a”的算法;递归的;Javascript数据结构中的项,javascript,arrays,Javascript,Arrays,假设我有一个Javascript数据结构,例如: var数据={ id:'5551212', 儿童:[ {id:'5551213'}, {id:'5551214'}, { id:'5551215', 儿童:[ {id:'5551213'}, {id:'5551212'}/使用以下命令: var arr = [] function detectRecursive(object){ var x for(x in object){ if(arr.indexOf([x,object[x]])=
var数据={
id:'5551212',
儿童:[
{id:'5551213'},
{id:'5551214'},
{
id:'5551215',
儿童:[
{id:'5551213'},
{id:'5551212'}/使用以下命令:
var arr = []
function detectRecursive(object){
var x
for(x in object){
if(arr.indexOf([x,object[x]])==-1){
arr.push([x,object[x]])
var tmp = {}
if(typeof object[x] == typeof tmp){
detectRecursive(object[x])
}
}
}
}
这将循环数组的键和值如何操作:
检查当前子树的父级是否包含其根id
如果否,并且子树有子树-递归检查它们的子树
如果没有子项-返回false
代码如下:
function isRecursive(tree, parents){
if (parents.indexOf(tree.id) !== -1){
return true;
} else if (tree.children) {
return tree.children.some(child => isRecursive(child, [tree.id].concat(parents)));
}
return false;
}
isRecursive(data, []);
可以通过将数组替换为set来改进它,但我希望使它尽可能兼容。您可以使用映射来跟踪每个id
值键入的“路径”。然后,当您发现id
已经在该映射中时,您可以将这对路径推送到结果数组
以下是该方法的工作原理:
函数收集重复项(数据){
常量映射=新映射,
dups=[];
函数递归(数据、路径){
if(map.has(data.id)){
dups.push([data.id,map.get(data.id),path]);
}否则{
map.set(data.id,path);
}
(data.children | |[]).forEach((child,i)=>{
递归(data.children[i],path+'.children['+i+']');
})
}
递归(数据,'数据');
返回DUP;
}
//样品
风险值数据={
id:'5551212',
儿童:[
{id:'5551213'},
{id:'5551214'},
{
id:'5551215',
儿童:[
{id:'5551213'},
{id:'5551212'}
]
}
]
};
console.log(收集重复项(数据));
.as控制台包装{max height:100%!important;top:0;}
您尝试过使用JSON.stringify()吗
?如果找到值会发生什么?@guest271314我认为问题不在于有周期的对象。我认为问题在于找到以违反某些约定的方式重复使用的属性值。我认为您的意思是“重复”或“重复”不是递归的。如果将对象的一个成员的值设置为父对象,则为递归。@Pointy Yes,JSON.stringify()
replacer
函数是递归函数,可用于匹配或删除结果JavaScript对象中的属性。RegExp
也可用于匹配重复的值。不清楚如果出现重复的属性、值对,会发生什么情况。违反的id是否有引用祖先的id?即grand根的子级是根的子级在同一分支上的父级???OP中的对象可以成功地字符串化为JSON。试试看!问题不是数据结构中的实际循环,而是违反某些约束的属性值。我尝试了JSON.stringify建议,但没有“非法”的地方关于此数据结构。它只是字符串化了。如果并行分支中存在重复项,例如,children:[{id:X},{id:X}]
@georg,至少就我而言,并行分支中的副本是可以接受的。这是一个可接受的构造。我只对具有与其祖先相同id的子级的副本感兴趣。