递归处理嵌套括号字符串时,为何打印变量仍报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
相关产品推荐
相关产品推荐

