使用indexOf()结合for循环实现数组字符包含校验时遇问题求助
问题分析与修复方案
嘿,我一眼就看到你代码里的问题了——你的for循环在第一次迭代就直接return了,根本没检查完第二个字符串里的所有字符!
比如你测试的mutation(["hello", "hey"]),第二个字符串的第一个字符是h,hello里确实有这个字符,所以代码直接返回true,但完全没去检查后面的e和y——而hello里根本没有y,正确结果应该是false才对。
具体来说,你这段代码的问题点:
- 循环里的
return first.indexOf(second[i]) !== -1 ? true : false;这行逻辑错了:只要第一个字符匹配就立刻返回true,如果第一个不匹配就返回false,完全没遍历完所有需要检查的字符。 - 另外,
i没有用var/let声明,会变成全局变量,这也是个容易踩的小坑。
给你修正后的代码:
function mutation(arr) { var first = arr[0].toLowerCase(); var second = arr[1].toLowerCase(); // 用let声明i,避免全局变量污染 for(let i = 0; i < second.length; i++){ // 只要有一个字符找不到,直接返回false if(first.indexOf(second[i]) === -1){ return false; } } // 所有字符都找到了,才返回true return true; }
修正的逻辑很简单:
- 遍历第二个字符串的每一个字符
- 只要发现某个字符在第一个字符串里不存在,立刻返回
false - 如果循环完整跑完,说明所有字符都能匹配,这时候才返回
true
如果你喜欢更简洁的写法,还可以用数组的every方法,逻辑更直观:
function mutation(arr) { const firstStr = arr[0].toLowerCase(); // 把第二个字符串拆成字符数组,检查每个字符是否都被第一个字符串包含 return arr[1].toLowerCase().split('').every(char => firstStr.includes(char)); }
内容的提问来源于stack exchange,提问作者emred2700
相关产品推荐
相关产品推荐

