JavaScript如何编写接收2个字符串返回无重复共通字符数组的函数
现有代码问题修正
你当前的代码首先存在2个可优化/修复的点:
- 内层匹配判断存在索引笔误:
if (new_str1[i] == new_str2[i])中第二个下标应为内层循环变量j,否则只会比对两个字符串同位置的字符,无法遍历str2的所有字符 replace(" ", "")只会替换字符串中的第一个空格,建议替换为replaceAll(" ", "")实现移除所有空格的效果
字符去重实现思路
针对去重需求,推荐两种适合初学者理解的实现方案:
- 方案1:存入数组前校验去重
每次匹配到共通字符后,先用数组的includes()方法判断该字符是否已经存在于结果数组中,仅当不存在时才执行push操作,从源头避免重复值进入结果。这种方案逻辑直观,还可以提前跳过已匹配过的字符,降低不必要的循环次数。 - 方案2:最终结果统一去重
先保留所有匹配到的重复字符,最后利用ES6Set数据结构天然不存储重复值的特性,将结果数组转成Set后再转回数组即可完成去重,代码写法非常简洁。
修正后完整代码(方案1实现)
function get_common_characters(str1, str2) { let common_chars = [] // 预处理字符串:移除所有空格、统一转小写 const new_str1 = str1.replaceAll(" ", "").toLowerCase() const new_str2 = str2.replaceAll(" ", "").toLowerCase() for (let i = 0; i < new_str1.length; i++) { const currentChar = new_str1[i] // 已存在于结果数组的字符直接跳过,不需要再循环比对 if (common_chars.includes(currentChar)) continue for (let j = 0; j < new_str2.length; j++) { if (currentChar === new_str2[j]) { common_chars.push(currentChar) // 匹配到后直接跳出内层循环,不需要再比对剩余字符 break } } } return common_chars }
如果采用方案2,只需要修改最终返回的代码即可,其余循环逻辑不需要调整:
// 剩余代码和你原来的逻辑一致,仅修改返回值即可完成去重 return [...new Set(common_chars)]
内容的提问来源于stack exchange,提问作者Nix
相关产品推荐
相关产品推荐

