You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归处理嵌套括号字符串时,为何打印变量仍报Cannot read property of undefined错误?

问题原因分析

你遇到的这个错误核心原因很明确:在递归函数的if分支末尾没有返回值,导致某些递归调用结束时默认返回undefined,上层代码试图访问undefined[0]自然就抛出了Cannot read property '0' of undefined的错误。

为什么之前的console.log(rS[0])能正常打印?因为那是在某个正确返回的递归步骤中——比如处理"hi)"的时候,代码进入else分支,正确返回了包含结果数组和剩余字符串的数组,此时rS是有效的。但当这个递归返回后,上层的if分支执行完element = rS[1]后就没有后续操作了,函数默认返回undefined,再上层的调用拿到的rS就是undefined,这时候访问rS[0]就触发了错误。

解决方法

只需要在if分支的末尾,添加一条返回语句,把当前处理好的elementComponents和剩余的element组成数组返回,和else分支保持一致的返回格式即可:

const preProcessString = element => { 
  var elementComponents = []; 
  var part = ""; 
  var rS; 
  if ( element.indexOf("(") < element.indexOf(")") && element.indexOf("(") !== -1 ) { 
    part = element.slice(0, element.indexOf("(")); 
    elementComponents.push(part); 
    rS = preProcessString(element.substr(element.indexOf("(") + 1)); 
    elementComponents.push(rS[0]); 
    element = rS[1]; 
    // 新增:返回当前处理结果和剩余字符串
    return [elementComponents, element];
  } else { 
    part = element.slice(0, element.indexOf(")")); 
    elementComponents.push(part); 
    return [elementComponents, element.substr(element.indexOf(")") + 1)]; 
  } 
}; 

console.log(preProcessString("(hello(hi)are(yo(u)))"));

修改后运行,你会发现错误消失,函数能正确返回嵌套数组结构了。不过当前输出会包含最外层的空字符串(因为输入开头是(,第一次slice(0, indexOf("("))得到空),你可以后续再处理这类无关的空元素,或者在预处理阶段先去掉首尾的括号。

内容的提问来源于stack exchange,提问作者Amit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 20:42:31