Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查找“a”的算法;递归的;Javascript数据结构中的项_Javascript_Arrays - Fatal编程技术网

查找“a”的算法;递归的;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]])=

假设我有一个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]])==-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的子级的副本感兴趣。