Javascript 如何停止这个递归函数?

Javascript 如何停止这个递归函数?,javascript,arrays,circular-reference,Javascript,Arrays,Circular Reference,我有javascript数组,其中每个项都引用到父项,它们可以循环(循环引用)。例如: [ {"id": 1, "firstName": "Macko","parentId": 12}, {"id": 2, "firstName": "Jess","parentId": 1}, {"id": 3, "firstName": "Peter","parentId": 1}, {"id": 4, "firstName": "Lisa",

我有javascript数组,其中每个项都引用到父项,它们可以循环(循环引用)。例如:

[
        {"id": 1, "firstName": "Macko","parentId": 12},
        {"id": 2, "firstName": "Jess","parentId": 1},
        {"id": 3, "firstName": "Peter","parentId": 1},
        {"id": 4, "firstName": "Lisa", "parentId": 1},
        {"id": 5, "firstName": "Megan","parentId": 1},
        {"id": 6, "firstName": "John", "parentId": 4},
        {"id": 7, "firstName": "Joe", "parentId": 4},
        {"id": 8, "firstName": "Matthew","parentId": 2},
        {"id": 9, "firstName": "Peter","parentId": 2},
        {"id": 10, "firstName": "Dio","parentId": 5},
        {"id": 11, "firstName": "Hello","parentId": 5},
        {"id": 12, "firstName": "Ana", "parentId": 4}
]
我需要基于所选记录创建嵌套的数据结构,以在DOM中显示它,这是通过递归函数实现的,如下面(源代码)

它工作得非常好,但不适用于循环数据结构。问题是我需要在函数执行到达它开始的元素之前停止它


我怎样才能做到这一点

也许这样的事情对你来说应该有用:

function getNestedChildren(arr, parent, visited_list) {
  var out = []
  for(var i in arr) {
    if(!(arr[i].id in visited_list) && (arr[i].parentId == parent)) {

        visited_list[arr[i].id] = true;
        var children = getNestedChildren(arr, arr[i].id, visited_list)

        if(children.length) {
            arr[i].children = children
        }
        out.push(arr[i])
    }
  }
  return out
}

nestedList = getNestedChildren(arr, 1, [])

也许这样的事情应该适合你:

function getNestedChildren(arr, parent, visited_list) {
  var out = []
  for(var i in arr) {
    if(!(arr[i].id in visited_list) && (arr[i].parentId == parent)) {

        visited_list[arr[i].id] = true;
        var children = getNestedChildren(arr, arr[i].id, visited_list)

        if(children.length) {
            arr[i].children = children
        }
        out.push(arr[i])
    }
  }
  return out
}

nestedList = getNestedChildren(arr, 1, [])

您可以标记已访问的条目。基于此,您可以跳过处理同一元素两次

在将
子属性添加到元素时,可以将其用于此标记目的,前提是在元素没有子属性时也创建此属性

下面是执行此操作的工作代码:

函数getNestedChildren(arr,父级){ var out=[]; 用于(arr中的var i){ if(arr[i].parentId==parent){ if(arr[i].子项===未定义){ arr[i].儿童=[] var children=getNestedChildren(arr,arr[i].id) arr[i].children=children } 向外推(arr[i]) } } 返回 } var arr=[ {“id”:1,“firstName”:“Macko”,“parentId”:12}, {“id”:2,“firstName”:“Jess”,“parentId”:1}, {“id”:3,“firstName”:“Peter”,“parentId”:1}, {“id”:4,“firstName”:“Lisa”,“parentId”:1}, {“id”:5,“firstName”:“Megan”,“parentId”:1}, {“id”:6,“firstName”:“John”,“parentId”:4}, {“id”:7,“firstName”:“Joe”,“parentId”:4}, {“id”:8,“firstName”:“Matthew”,“parentId”:2}, {“id”:9,“firstName”:“Peter”,“parentId”:2}, {“id”:10,“firstName”:“Dio”,“parentId”:5}, {“id”:11,“firstName”:“你好”,“parentId”:5}, {“id”:12,“firstName”:“Ana”,“parentId”:4} ] getNestedChildren(arr,1) //输出子数组的长度 document.body.innerHTML=arr.map(函数(项){ 返回'Item'+Item.id+'具有'+Item.children.length+'children'
}).join(“
”)
您可以标记已访问的条目。基于此,您可以跳过处理同一元素两次

在将
子属性添加到元素时,可以将其用于此标记目的,前提是在元素没有子属性时也创建此属性

下面是执行此操作的工作代码:

函数getNestedChildren(arr,父级){ var out=[]; 用于(arr中的var i){ if(arr[i].parentId==parent){ if(arr[i].子项===未定义){ arr[i].儿童=[] var children=getNestedChildren(arr,arr[i].id) arr[i].children=children } 向外推(arr[i]) } } 返回 } var arr=[ {“id”:1,“firstName”:“Macko”,“parentId”:12}, {“id”:2,“firstName”:“Jess”,“parentId”:1}, {“id”:3,“firstName”:“Peter”,“parentId”:1}, {“id”:4,“firstName”:“Lisa”,“parentId”:1}, {“id”:5,“firstName”:“Megan”,“parentId”:1}, {“id”:6,“firstName”:“John”,“parentId”:4}, {“id”:7,“firstName”:“Joe”,“parentId”:4}, {“id”:8,“firstName”:“Matthew”,“parentId”:2}, {“id”:9,“firstName”:“Peter”,“parentId”:2}, {“id”:10,“firstName”:“Dio”,“parentId”:5}, {“id”:11,“firstName”:“你好”,“parentId”:5}, {“id”:12,“firstName”:“Ana”,“parentId”:4} ] getNestedChildren(arr,1) //输出子数组的长度 document.body.innerHTML=arr.map(函数(项){ 返回'Item'+Item.id+'具有'+Item.children.length+'children'
}).join(“
”)
选中的
数组保留所有对象(父对象)的
id
s
getNestedChildren
已被调用

如果当前子项的
id
在该数组中,则不要将其作为子项包含

var arr = [
  {"id": 1, "firstName": "Macko","parentId": 12},
  {"id": 2, "firstName": "Jess","parentId": 1},
  {"id": 3, "firstName": "Peter","parentId": 1},
  {"id": 4, "firstName": "Lisa", "parentId": 1},
  {"id": 5, "firstName": "Megan","parentId": 1},
  {"id": 6, "firstName": "John", "parentId": 4},
  {"id": 7, "firstName": "Joe", "parentId": 4},
  {"id": 8, "firstName": "Matthew","parentId": 2},
  {"id": 9, "firstName": "Peter","parentId": 2},
  {"id": 10, "firstName": "Dio","parentId": 5},
  {"id": 11, "firstName": "Hello","parentId": 5},
  {"id": 12, "firstName": "Ana", "parentId": 4}
];

var getNestedChildren = function(arr, id, checked) {

  var out = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i].parentId === id && checked.indexOf(arr[i].id) === -1) {
      checked.push(id);
      var children = getNestedChildren(arr, arr[i].id, checked);
      if (children.length) {
        arr[i].children = children;
      }
      out.push(arr[i]);
    }
  }
  return out;

};

console.log(getNestedChildren(arr, 12, []));
var-arr=[
{“id”:1,“firstName”:“Macko”,“parentId”:12},
{“id”:2,“firstName”:“Jess”,“parentId”:1},
{“id”:3,“firstName”:“Peter”,“parentId”:1},
{“id”:4,“firstName”:“Lisa”,“parentId”:1},
{“id”:5,“firstName”:“Megan”,“parentId”:1},
{“id”:6,“firstName”:“John”,“parentId”:4},
{“id”:7,“firstName”:“Joe”,“parentId”:4},
{“id”:8,“firstName”:“Matthew”,“parentId”:2},
{“id”:9,“firstName”:“Peter”,“parentId”:2},
{“id”:10,“firstName”:“Dio”,“parentId”:5},
{“id”:11,“firstName”:“你好”,“parentId”:5},
{“id”:12,“firstName”:“Ana”,“parentId”:4}
];
var getNestedChildren=函数(arr、id、选中){
var out=[];
对于(变量i=0;i
选中的
数组保留所有对象(父对象)的
id
s
getNestedChildren
已被调用

如果当前子项的
id
在该数组中,则不要将其作为子项包含

var arr = [
  {"id": 1, "firstName": "Macko","parentId": 12},
  {"id": 2, "firstName": "Jess","parentId": 1},
  {"id": 3, "firstName": "Peter","parentId": 1},
  {"id": 4, "firstName": "Lisa", "parentId": 1},
  {"id": 5, "firstName": "Megan","parentId": 1},
  {"id": 6, "firstName": "John", "parentId": 4},
  {"id": 7, "firstName": "Joe", "parentId": 4},
  {"id": 8, "firstName": "Matthew","parentId": 2},
  {"id": 9, "firstName": "Peter","parentId": 2},
  {"id": 10, "firstName": "Dio","parentId": 5},
  {"id": 11, "firstName": "Hello","parentId": 5},
  {"id": 12, "firstName": "Ana", "parentId": 4}
];

var getNestedChildren = function(arr, id, checked) {

  var out = [];
  for (var i = 0; i < arr.length; i++) {
    if (arr[i].parentId === id && checked.indexOf(arr[i].id) === -1) {
      checked.push(id);
      var children = getNestedChildren(arr, arr[i].id, checked);
      if (children.length) {
        arr[i].children = children;
      }
      out.push(arr[i]);
    }
  }
  return out;

};

console.log(getNestedChildren(arr, 12, []));
var-arr=[
{“id”:1,“firstName”:“Macko”,“parentId”:12},
{“id”:2,“firstName”:“Jess”,“parentId”:1},
{“id”:3,“firstName”:“Peter”,“parentId”:1},
{“id”:4,“firstName”:“Lisa”,“parentId”:1},
{“id”:5,“firstName”:“Megan”,“parentId”:1},
{“id”:6,“firstName”:“John”,“parentId”:4},
{“id”:7,“firstName”:“Joe”,“parentId”:4},
{“id”:8,“firstName”:“Matthew”,“parentId”:2},
{“id”:9,“firstName”:“Peter”,“parentId”:2},
{“id”:10,“firstName”:“Dio”,“parentId”:5},
{“id”:11,“firstName”:“你好”,“parentId”:5},
{“id”:12,“firstName”:“Ana”,“parentId”:4}
];
var getNestedChildren=函数(arr、id、选中){
变量输出=[