JavaScript数组相等性检查问题:CodeWars题目等值判断报错求助
排查等值图(Isogram)判断代码的错误
嘿,我一眼就看到你代码里的关键问题啦,咱们来一步步拆解:
核心错误分析
你在内部循环的判断条件里写了 if (split[i] !== split[i][j]) —— 这是个典型的笔误!
split是你把字符串转小写后拆分得到的字符数组,split[i]已经是单个字符了(比如输入是"abca"时,split[0]就是"a")。split[i][j]相当于去取这个单个字符的第j个索引位置,而单个字符的字符串只有索引0,当j>0时这个值永远是undefined,所以你的判断条件永远为真,自然永远不会进入else分支打印"They are equal"。
修正后的完整代码
首先把判断条件改成 split[i] === split[j],同时补充函数的返回逻辑(原代码没返回结果),还可以在发现重复时直接终止循环提升效率:
function isIsogram(str){ const split = str.toLowerCase().split(''); let result = true; // 用let声明循环变量,避免变量提升导致的逻辑问题 for (let i = 0; i < split.length; i++){ for (let j = i+1; j < split.length; j++){ if (split[i] === split[j]) { console.log(`${split[i]} 和 ${split[j]} 重复了`); result = false; // 发现重复直接跳出所有循环,不用继续判断 return result; } } } return result; } // 测试用例 console.log(isIsogram("abca")); // 输出false console.log(isIsogram("abcde")); // 输出true
更简洁的实现方式
其实用ES6的Set可以更优雅地实现这个功能,因为Set会自动去除重复元素,我们只需要比较去重后的长度和原字符串转小写后的长度是否相等:
function isIsogram(str) { const lowerStr = str.toLowerCase(); return new Set(lowerStr).size === lowerStr.length; }
这个方法代码更简洁,执行效率也更高,推荐使用~
内容的提问来源于stack exchange,提问作者Greg Ulrich
相关产品推荐
相关产品推荐

