首页 > 解决方案 > Javascript Recussion 错误 - RangeError:超出最大调用堆栈大小

问题描述

我有一个递归会出现这个错误RangeError: Maximum call stack size exceeded

递归函数

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"]}
}

LOGIN 等于如下

account_1 

通过进行我的递归将出现此错误RangeError: Maximum call stack size exceeded,将不胜感激。

提前致谢

标签: javascript

解决方案


我假设这是 CoffeeScript。这有效:

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_1account_5那是flat变量,所以为了测试目的,我把它们改成了字符串。同样,我不知道你从哪里拿isEmpty的,所以我使用了 CoffeeScript 的方式 + 我不在乎 children 列表是否为空,因为迭代空的可迭代对象是什么都不做。

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


推荐阅读