如何实现判断数组中恰好一个元素经回调函数返回true的功能?
修正
one函数的实现 你的当前代码存在两个核心问题:
- 仅找到第一个满足条件的元素就直接返回
true,无法判断是否恰好只有一个元素符合要求(比如测试用例3会错误返回true) - 调用回调函数时没有传入元素的索引,导致依赖索引的回调逻辑无法正常工作(比如测试用例6)
以下是正确的实现:
function one(array, cb) { let count = 0; for (let i = 0; i < array.length; i++) { // 传入元素和索引给回调函数 if (cb(array[i], i)) { count++; // 提前终止:如果数量超过1,没必要继续遍历 if (count > 1) { return false; } } } // 遍历结束后判断是否恰好有一个符合条件的元素 return count === 1; } // 测试用例验证 let result1 = one(['x', 'y', 'z'], function(el) { return el === 'a'; }); console.log("1 F:" + result1); // false let result2 = one(['x', 'a', 'y', 'z'], function(el) { return el === 'a'; }); console.log("2 T:" + result2); // true let result3 = one(['x', 'a', 'y', 'a', 'z'], function(el) { return el === 'a'; }); console.log("3 F:" + result3); // false let result4 = one(['apple', 'dog'], function(el) { return el.length > 3; }); console.log("4 T:" + result4); // true let result5 = one(['apple', 'dog', 'pear'], function(el) { return el.length > 3; }); console.log("5 F:" + result5); // false let result6 = one(['apple', 'dog', 'food', 'cat'], function(el, idx) { return el.length === idx; }); console.log("6 T:" + result6); // true
实现说明:
- 用
count变量统计符合回调条件的元素数量 - 遍历数组时,给回调函数传入元素和索引两个参数
- 当
count超过1时直接返回false,提前终止遍历提升性能 - 遍历完成后,判断
count是否严格等于1,返回对应的布尔值
内容的提问来源于stack exchange,提问作者UpsetSheepHerder
相关产品推荐
相关产品推荐

