为何JS递归数组操作函数输出正确却抛出TypeError/Node stderr?
问题原因分析
你的代码抛出TypeError的直接原因是递归调用时传入了不存在的数组元素,导致后续尝试访问query[0]和query[1]时,query本身是undefined。
具体触发流程
我们一步步走一遍你的代码执行逻辑(以调用arrayManipulation(5, [[1,2,100],[2,5,100],[3,4,100]])为例):
- 初始调用
recurring(array, queries[0], 0),此时y=0,处理第一个查询。 - 处理完后,判断
y < queries.length(0 < 3成立),y自增为1,调用recurring(newArg, queries[1], 1),处理第二个查询。 - 处理完第二个查询,
y=1 < 3成立,y自增为2,调用recurring(newArg, queries[2], 2),处理第三个查询。 - 处理完第三个查询,
y=2 < 3仍然成立,y自增为3,此时调用recurring(newArg, queries[3], 3)——但queries数组只有3个元素(索引0、1、2),queries[3]是undefined! - 进入
recurring函数后,执行var start = query[0],试图从undefined上读取属性0,直接抛出TypeError: Cannot read properties of undefined (reading '0')。
额外的小问题
除了这个报错,你的代码还有一个逻辑瑕疵:递归调用时没有返回值,导致var solution = recurring(...)最终拿到的是undefined,而不是最终处理完的数组。比如在递归调用recurring(newArg, queries[y], y)时,需要加上return才能把最终的返回值传递上去。
修复方案
调整递归的判断逻辑,确保只有当还有未处理的查询时才进行递归,并且正确返回递归结果:
function arrayManipulation(n, queries) { var array = new Array(n).fill(0) var x = 0 var recurring = (argmnt, query, y) => { var start = query[0], end = query[1] var newArg = argmnt.map((el, index) => { if(index+1 >= start && index+1 <= end){ return query[2] + el }else{ return el } }) console.log(newArg) // 调整判断:当y+1 < queries.length时,说明还有下一个查询要处理 if (y + 1 < queries.length ){ // 递归调用时要return,把结果传递回去 return recurring(newArg, queries[y+1], y+1) }else{ return newArg } } var solution = recurring(array, queries[x], x) // 可以添加这行来查看最终结果 console.log("Final solution:", solution) return solution } arrayManipulation(5, [[1, 2, 100], [2, 5, 100], [3, 4, 100]])
这样修改后,递归只会处理到最后一个查询(索引2),不会再尝试访问不存在的queries[3],同时递归的返回值会正确传递到最外层的solution变量中。
内容的提问来源于stack exchange,提问作者Devin
相关产品推荐
相关产品推荐

