如何编写JavaScript函数通过findTheNeedle的两个单元测试
问题原因
你当前的代码存在两个核心问题导致无法通过测试:
- 函数参数设计错误:测试用例调用查找函数时会传入两个参数,第一个是待搜索的单词数组,第二个是要查找的目标字符串,但你当前的函数只接收1个参数,还硬编码了仅匹配
"needle",自然无法通过第二个查找"plant"的测试。 - 逻辑存在冗余与隐患:你用
var声明的needle变量存在变量提升特性,如果数组中没有对应匹配项时会返回undefined,且没有提前终止循环的逻辑,不需要遍历完整个数组就能返回结果。 - 额外匹配问题:测试用例中导入的模块路径是
./find-needle,如果你的函数文件名是find.js,会出现模块找不到的报错,需要调整文件名或者导入路径。
修改方案
方案1:调整原有循环逻辑
修改后的find.js代码如下:
// 新增第二个参数接收要查找的目标字符串 function findNeedle(words, target) { for (var i = 0; i < words.length; i++) { // 匹配传入的目标值,不是硬编码的needle if (words[i] === target) { // 找到后直接返回索引,不需要继续遍历 return i; } } // 未找到时返回-1,和数组原生查找行为保持一致 return -1; } module.exports = findNeedle;
同时把测试文件里的导入语句改为和文件名匹配的形式:
var findTheNeedle = require("./find");
或者直接把find.js重命名为find-needle.js即可。
方案2:使用原生数组方法简化实现
也可以直接用JS数组内置的indexOf方法,代码更简洁,行为完全符合测试要求:
function findNeedle(words, target) { return words.indexOf(target); } module.exports = findNeedle;
内容的提问来源于stack exchange,提问作者nathan
相关产品推荐
相关产品推荐

