Javascript恢复错误-RangeError:超过最大调用堆栈大小

Javascript恢复错误-RangeError:超过最大调用堆栈大小,javascript,Javascript,我有一个递归,该递归将指向此错误RangeError:超出了最大调用堆栈大小 递归函数 window.traverse_all_sublogins = (flat, LOGIN) => { let sublogins = [LOGIN]; if (flat[LOGIN] && flat[LOGIN].children) { let children = flat[LOGIN].children; for (let i of c

我有一个递归,该递归将指向此错误RangeError:超出了最大调用堆栈大小

递归函数

window.traverse_all_sublogins = (flat, LOGIN) => {
    let sublogins = [LOGIN];
    if (flat[LOGIN] && flat[LOGIN].children) {
        let children = flat[LOGIN].children;
        for (let i of children) {
            sublogins = sublogins.concat(traverse_all_sublogins(flat, children[i]));
        }
    }
    return sublogins;
};
与下面相等的平面

{
"account_1": {"login": account_1, "parent": "account_2", "path": [],"children": ["account_3", "account_4"]}
"account_5": {"login": account_5, "parent": "account_6", "path": [],"children": ["account_7", "account_8"]}
}
登录时与下面相同

account_1 
通过进入我的递归,将出现此错误RangeError:超出了最大调用堆栈大小,我们将非常感谢您的帮助


提前感谢

虽然这看起来不像javascript,但如果是javascript,这可能就是您想要的

另外,最大调用堆栈可能意味着您可以无限递归地调用traverse\u all\u子日志,这可能是因为if语句只保护第一行,而不是for循环

window.traverse_all_sublogins = (flat, LOGIN) => {

    var sublogins = [LOGIN];
    if (!isEmpty(flat[LOGIN].children)) {
      var children = flat[LOGIN].children
      for (var i of children) {
        sublogins = sublogins.concat(traverse_all_sublogins(flat, children[i]))
      }
    }
    return sublogins;
}

我想这是咖啡脚本。这项工作:

traverse_all_sublogins = (flat_login_table, login) ->
  sublogins = [login]
  if login of flat_login_table
    for child in flat_login_table[login].children
      sublogins = sublogins.concat(traverse_all_sublogins(flat_login_table, child))
  return sublogins
我不知道你从哪里把
account\u 1
account\u 5
作为变量,它们在
flat
中,所以为了测试的目的,我把它们改成了字符串。类似地,我不知道您从何处获取了
isEmpty
,因此我使用了CoffeeScript的方法+我不关心子列表是否为空,因为迭代空的iterable工作时什么也不做


我建议使用比“login”和“flat”或“login”更好的名称。你是说用户名和别名吗?flat是一个完整的DB表,可以在JS中手动遍历吗?如果是这样,您可以用SQL编写此函数。另外,在编写多行代码时,请使用显式“return”,这样可读性更好。

这确实意味着调用函数的次数太多。你的数据中有循环吗?谢谢@Ctrl-C if语句完成了这项工作,我的递归最终得到了修复,谢谢你的帮助关于你所说的,数据不是在后台形成的,它来自DB数据,内部的子对象可以是任何东西,从这个子对象使用递归,我创建了一个在who下面的树,等等