如何停止此递归函数?

t

我有一个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) {
  var out = []
  for(var i in arr) {
    if(arr[i].parent == parent) {
        var children = getNestedChildren(arr, arr[i].id)

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

它确实运行良好,但不适用于循环数据结构。事情是我需要停止函数执行,直到它到达它从其开始的元素。

我怎样才能做到这一点?

ish

checked数组保留已调用id的所有对象(父对象)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, []));

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使此阶乘函数递归?

来自分类Dev

如何停止此setInterval函数?

来自分类Dev

如何编写此递归Haskell函数

来自分类Dev

此递归函数如何更改“历史”变量?

来自分类Dev

如何编写此迭代函数以递归?

来自分类Dev

此递归函数如何返回正确答案?

来自分类Dev

为什么此递归函数没有停止?

来自分类Dev

如何在JavaScript中停止递归函数?

来自分类Dev

如何在 2 次迭代后停止此递归方法

来自分类Dev

此递归函数的意义

来自分类Dev

递归函数不停止?

来自分类Dev

如何在Swift中编写此递归函数?

来自分类Dev

如何使此递归函数更有效?

来自分类Dev

此递归数组置换函数如何在后台运行?

来自分类Dev

如何以非递归形式重写此函数?

来自分类Dev

谁能告诉我此函数的递归部分如何工作?

来自分类Dev

如何摆脱此递归Scheme函数产生的#<void>?

来自分类Dev

您如何利用Swift功能来重构此递归函数?

来自分类Dev

如何在索引超出范围之前停止递归函数?

来自分类Dev

如何在索引超出范围之前停止递归函数?

来自分类Dev

努力了解此递归函数

来自分类Dev

如何停止递归?

来自分类Dev

如何停止 setTimeout 递归

来自分类Dev

在Python中停止递归函数

来自分类Dev

如何停止此for循环?

来自分类Dev

如何停止此NSThread?

来自分类Dev

此递归如何重复自身?

来自分类Dev

如何递归应用此功能

来自分类Dev

此递归代码如何工作?