如何识别并修正代码逻辑错误?程序误判所有嫌疑人为无罪
代码逻辑错误排查:嫌疑人判定问题
问题现象
运行代码时,数组中明明存在符合条件的嫌疑人(第二个对象LIANNE NIEMELA),但所有嫌疑人均显示为“not guilty”。尝试将条件中的&&替换为||后得到了正确结果,但未找到根本原因。
错误分析
问题出在matchSuspect函数的两处逻辑错误:
- 参数未利用+逻辑错位:函数接收了
suspectObj参数,但完全没有使用,反而在内部遍历整个suspectsArray数组。结合draw函数的调用逻辑(逐个传入嫌疑人对象检查),这属于逻辑错位——我们需要判断的是当前传入的单个嫌疑人是否符合条件,而非遍历整个数组找匹配项。 - 循环内过早返回false:在遍历数组的循环中,只要第一个嫌疑人不符合条件,就直接
return false终止函数,根本不会检查后续的嫌疑人。这直接导致无论后续有没有符合条件的对象,函数都会返回false。
修复方案
修改matchSuspect函数,让它专注于判断传入的单个嫌疑人对象是否符合条件,去掉多余的数组遍历:
function matchSuspect(suspectObj){ return suspectObj.glasses == "blue" && suspectObj.accessory == "plastic box" && suspectObj.eyes == "brown" && suspectObj.height > 141 && suspectObj.age < 49; }
如果坚持要通过遍历数组的方式实现(但结合当前draw的循环逻辑,这种方式冗余且容易出错),需要将return false移到循环结束之后,确保遍历完所有嫌疑人再返回结果:
// 仅作逻辑演示,不推荐此写法,因为draw中已在遍历数组 function matchSuspect(){ for (var k = 0; k < suspectsArray.length; k++){ if( suspectsArray[k].glasses == "blue" && suspectsArray[k].accessory == "plastic box" && suspectsArray[k].eyes == "brown" && suspectsArray[k].height > 141 && suspectsArray[k].age < 49 ){ return true; } } return false; } // 注意:此时draw中调用时无需传入参数,否则参数会被浪费
修复后效果
修改后,draw函数逐个传入嫌疑人对象到matchSuspect,第二个嫌疑人LIANNE NIEMELA会匹配所有条件,以红色显示“is guilty!”,其余嫌疑人显示绿色的“is not guilty”。
内容的提问来源于stack exchange,提问作者FabioD
相关产品推荐
相关产品推荐

