【发布时间】:2020-05-02 02:50:32
【问题描述】:
我正在尝试从我的数组productsDeduped 生成所有可能的名称组合,然后将生成的组合存储为productTags 数组。这是我的代码:
//function to generate all possible combinations
function getCombinations(array) {
var i,
result = [];
for (i = 0; i < array.length; i++) {
result.push(
array[i],
...getCombinations(array.filter((_, j) => i !== j)).map(v => array[i] + " " + v)
);
}
return result;
}
for (var i = 0; i < arrLength; i++) {
var productNameStrings = getCombinations(productsDeduped[i].tags);
productsDeduped[i].productTags = productNameStrings
}
我得到这个错误:
result.push(
^
RangeError: Maximum call stack size exceeded
at getCombinations (/Users/farhadam/Silobee/Inventory/categories/execute.js:1006:16)
at Object.<anonymous> (/Users/farhadam/Silobee/Inventory/categories/execute.js:1016:30)
at Module._compile (internal/modules/cjs/loader.js:1156:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1176:10)
at Module.load (internal/modules/cjs/loader.js:1000:32)
at Function.Module._load (internal/modules/cjs/loader.js:899:14)
at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
知道如何解决这个问题;我认为是因为请求量很大?
编辑:
我只是看得更深,当我将我的 productNameStrings 字符串数组限制为只有 9 个元素时,代码可以正常工作;但如果它在数组中有 10 个或更多字符串,它就会开始给我这个错误!还是不知道怎么解决。
【问题讨论】:
-
首先,您可以将结果数组声明移出函数,因为每次递归到函数中时,都会重新创建它。另一种方法是将其作为单独的参数传递给函数。
-
我认为大容量不是问题,而是调用堆栈大小,即每个输入形成多少递归迭代(我猜现在是 9)。一种称为动态编程的不同问题解决方法在这里会有所帮助,通过记忆以前的结果,您可以减少堆栈大小。
-
我是个小新手;我该怎么做呢?不确定如何将其编码为单独的参数!?谢谢!
-
我也将结果变量移出函数,但仍然出现相同的错误 - 尽管我确实希望每次返回循环时数组都开始为空,因为它会是一个新产品
-
每次你的代码调用一个函数时,runtime都会把当前的代码状态压入一个栈中,并在代码返回时将其弹出。这就是您收到“超出调用堆栈大小”错误的原因:堆栈已满,可连续推送 (
getCombinations()) 而不会弹出 (return)。这是递归代码的常见问题。你能举例说明输入数组和输出数组是什么样的吗?
标签: javascript arrays node.js loops stack-size