JavaScript实现数组数对间数字补全及内存溢出问题求助
解决JavaScript数组扩展时的内存溢出问题
看起来你遇到的内存溢出问题完全是因为内层循环的变量更新错误导致了死循环!咱们来拆解问题并修复它:
问题根源分析
你写的内层循环代码是这样的:
for (var j=start+1;j<=stop;start++){ array2.push(j) }
这里循环的判断条件是j <= stop,但你每次循环更新的却是start变量,j的值永远停留在start+1不会增长——这就导致循环永远不会终止,程序不断往array2里塞元素,最终耗尽JavaScript堆内存,抛出FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed错误。
修正后的代码
我们只需要修正内层循环的变量更新逻辑,同时优化外层循环的写法让逻辑更清晰:
// 示例输入数组 const originalArray = [38, 40, 51, 53, 57, 59, 70, 72, 104, 106, 111, 113, 117, 130, 134, 148, 154, 156]; const expandedArray = []; // 外层循环每次跳2步,直接处理每一组数对(偶数索引为起始,奇数为终止) for (let i = 0; i < originalArray.length; i += 2) { const start = originalArray[i]; const stop = originalArray[i + 1]; // 遍历从start到stop的所有数字,依次加入结果数组 for (let j = start; j <= stop; j++) { expandedArray.push(j); } } console.log(expandedArray); // 输出:[38, 39, 40, 51, 52, 53, 57, 58, 59, 70, 71, 72, 104, 105, 106, ...]
额外优化说明
- 用
let代替var:let是块级作用域变量,避免了var的函数级作用域带来的潜在变量污染问题 - 外层循环改为
i += 2:相比判断i%2==0,这种写法更直观,直接定位到每一组数对的起始索引
测试第二个示例
用你的第二个测试输入验证一下:
const testInput = [5, 9, 12, 15, 21, 24, 30, 36]; const testResult = []; for (let i = 0; i < testInput.length; i += 2) { const start = testInput[i]; const stop = testInput[i + 1]; for (let j = start; j <= stop; j++) { testResult.push(j); } } console.log(testResult); // 输出:[5, 6, 7, 8, 9, 12, 13, 14, 15, 21, 22, 23, 24, 30, 31, 32, 33, 34, 35, 36]
内容的提问来源于stack exchange,提问作者Gaurav N
相关产品推荐
相关产品推荐

