调试练习:根据对象值查找对应键名
调试原函数的正确方法
嘿,其实你完全不用重写整个函数,咱们一步步调试原代码就能搞定,问题出在一个很容易忽略的小细节上!
原代码的错误分析
先看看原函数的问题到底在哪儿:
keyOfObjectValue: function keyOfObjectValue(object, target) { for (var key in object) { if (object[key] === target) { return key; } else { return -1; } } }
核心问题是**return -1的位置完全错了**:在for...in循环内部,只要第一次遍历的键对应的值不等于目标值,函数就直接返回-1,循环直接终止,根本没机会检查后面的键。比如你的测试用例里,第一个键是cucumbers,值是14,和目标值20不匹配,函数立刻返回-1,永远不会去检查carrots这个键。
一步步调试修复
定位问题:先给循环加个日志,看看实际执行流程:
修改原代码添加调试日志:keyOfObjectValue: function keyOfObjectValue(object, target) { for (var key in object) { console.log('当前遍历键:', key, '对应值:', object[key]); // 打印当前遍历的键值对 if (object[key] === target) { return key; } else { return -1; } } }运行后你会发现控制台只打印了
当前遍历键:cucumbers 对应值:14,然后就输出了-1——这说明循环只执行了一次就结束了,问题瞬间清晰。修复错误:把
return -1移到循环外面,这样只有当遍历完对象所有的键、确认都没找到目标值时,才返回-1:function keyOfObjectValue(object, target) { for (var key in object) { if (object[key] === target) { return key; } // 这里不再提前返回,继续遍历下一个键 } // 遍历完所有键都没找到目标值,才返回-1 return -1; }测试验证:运行你的测试用例:
var result1 = keyOfObjectValue({cucumbers: 14, carrots: 20, peas: 400}, 20); console.log('should log "carrots":', result1);这时候控制台就会正确输出
should log "carrots": carrots,完全符合需求。
调试思路总结
遇到这类循环遍历的问题,优先通过添加日志观察循环的执行次数和流程,定位是否存在过早终止循环/函数的问题。这个原函数的错误非常典型——把本该在循环结束后执行的返回逻辑放到了循环内部,导致遍历不完整。只需要调整return的位置,就能快速修复,根本不需要重写整个函数。
内容的提问来源于stack exchange,提问作者zuzanna
相关产品推荐
相关产品推荐

