JavaScript函数修改:添加knife/fork不存在时返回-1的逻辑
问题修正方案
原代码的核心问题有三个:
- 初始化
knife和fork为0,找不到目标元素时无法返回要求的-1 - 循环嵌套逻辑错误,找
fork的循环被包在找knife的循环内部,会重复执行多次造成性能浪费 - 未处理“找不到元素时的属性赋值”逻辑,可能导致返回的对象缺失对应属性
方案一:单次遍历实现(高效低冗余)
function findKnifeAndFork(utensils) { console.log(utensils); // 先把默认值设为-1,找不到目标就保留该值 let knifeIndex = -1; let forkIndex = -1; // 一次遍历数组,同时检查两个目标元素 for(let i = 0; i < utensils.length; i++){ if(utensils[i] === 'knife'){ knifeIndex = i; } else if(utensils[i] === 'fork'){ forkIndex = i; } } return { knife: knifeIndex, fork: forkIndex }; }
方案二:利用数组原生方法(简洁易读)
JavaScript数组的indexOf方法正好符合需求:找到元素返回对应索引,找不到直接返回-1,代码可以简化到极致:
function findKnifeAndFork(utensils) { console.log(utensils); return { knife: utensils.indexOf('knife'), fork: utensils.indexOf('fork') }; }
原代码问题拆解
- 初始值错误:原代码用0作为初始值,就算数组里没有
knife或fork,返回的属性值还是0,违背“不存在则设为-1”的要求,必须把初始值设为-1。 - 循环结构错误:嵌套循环会导致每遍历一个元素就完整扫一遍数组找
fork,完全没必要,要么把两个循环分开,要么用单次循环同时处理。 - 属性赋值不完整:原代码只有找到元素时才会给对象属性赋值,找不到的话对应属性会缺失,必须确保无论找不找得到,属性都存在且值正确。
内容的提问来源于stack exchange,提问作者Adelle
相关产品推荐
相关产品推荐

