如何处理parseParsedMessage函数for循环中的未定义属性读取错误
解决TypeError: Cannot read properties of undefined (reading 'length')问题
我需要在规则ID不符合特定格式(示例消息:"i have a fox with rule id ### tm_violation tm_location tm_market")时处理异常,但运行以下代码时抛出错误:TypeError: Cannot read properties of undefined (reading 'length'),求解决方法。
function parseMessage(message) { let retMessage = ''; const startIndex = message.indexOf("### Rule ID:"); const endIndex = message.indexOf("]"); if(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex){ return message.substring(startIndex, endIndex); } else{ return retMessage; } } function parseParsedMessage(inputString){ let messagePart = inputString.split('--'); finalMessagePart = messagePart[1]; finalElements = []; let z = 1; for(let i = finalMessagePart.length+1; i > finalMessagePart.length; i--){ let elements = finalMessagePart.trim().split('-'); finalElements.push(elements); } return finalElements; } let message = "sbkjeheglhlasd"; let result = parseMessage(message); let parsedResult = parseParsedMessage(result); if(parsedResult.length === 0) { console.log("Rule ID does not follow the format"); } else{ console.log(parsedResult[0][0]); console.log(parsedResult[0][1]); console.log(parsedResult[0][2]); console.log(parsedResult[0][3]); console.log(parsedResult[0][4]); console.log(parsedResult[0][5]); console.log(parsedResult[0][6].replace(']','')); }
错误原因
- 当输入的
message中没有匹配到"### Rule ID:"和"]"时,parseMessage返回空字符串。空字符串传入parseParsedMessage后,inputString.split('--')得到的数组只有一个空字符串元素,messagePart[1]为undefined,此时访问finalMessagePart.length就会触发TypeError。 finalMessagePart和finalElements未用let/const声明,会成为全局变量,存在逻辑污染隐患。- 原代码中的for循环逻辑完全无效:循环条件
i = finalMessagePart.length+1; i > finalMessagePart.length; i--只会让循环执行0次,无法生成预期的元素数组。
解决方案
- 添加参数合法性校验:在
parseParsedMessage开头检查输入是否有效,避免访问undefined的属性。 - 修复变量声明:给
finalMessagePart和finalElements添加let声明,避免全局变量污染。 - 修正循环逻辑:移除无效循环,直接按需求拆分字符串生成目标数组。
- 添加索引安全校验:在输出结果时检查数组长度,避免访问不存在的索引。
修改后的代码
function parseMessage(message) { let retMessage = ''; const startIndex = message.indexOf("### Rule ID:"); const endIndex = message.indexOf("]"); if(startIndex !== -1 && endIndex !== -1 && startIndex < endIndex){ return message.substring(startIndex, endIndex); } else{ return retMessage; } } function parseParsedMessage(inputString){ // 校验输入是否为空 if (!inputString) { return []; } let messagePart = inputString.split('--'); // 检查是否存在第二个拆分元素 if (!messagePart[1]) { return []; } let finalMessagePart = messagePart[1]; let finalElements = []; // 直接拆分字符串生成数组 let elements = finalMessagePart.trim().split('-'); finalElements.push(elements); return finalElements; } let message = "sbkjeheglhlasd"; let result = parseMessage(message); let parsedResult = parseParsedMessage(result); if(parsedResult.length === 0) { console.log("Rule ID does not follow the format"); } else{ const firstElement = parsedResult[0]; // 遍历输出,安全处理最后一个元素的']' for (let i = 0; i < firstElement.length; i++) { const value = i === firstElement.length - 1 ? firstElement[i].replace(']','') : firstElement[i]; console.log(value); } }
内容的提问来源于stack exchange,提问作者seaworthiness
相关产品推荐
相关产品推荐

