JavaScript提取两个字符串相同单词:面试代码错误排查
你的代码存在这几个关键问题
1. 用赋值运算符代替了比较运算符
你在if条件里写的是splittedStr1[i] = splittedStr2[j],这是赋值操作,不是比较。它会把splittedStr2[j]的值赋给splittedStr1[i],然后判断这个赋值后的结果是否为“真值”(非空字符串都是真值),所以每次循环都会执行similarWords.push(),这就是输出里出现大量重复甚至错误元素的原因。
正确的比较应该用全等运算符===(推荐用===避免类型转换问题):
if (splittedStr1[i] === splittedStr2[j])
2. 内层循环起始索引错误
内层循环你写的是j = i,这会导致当i递增时,跳过str2中前i个元素的检查。比如当i=1时,j从1开始,不会检查str2[0],完全不符合“查找所有相同单词”的逻辑,应该让j从0开始遍历整个splittedStr2:
for (let j = 0; j < splittedStr2.length; j++)
3. 未声明循环变量,引发全局污染
i和j没有用let/var声明,会自动变成全局变量,在复杂代码中容易引发意外冲突,规范写法是在循环内声明变量:
for (let i = 0; i < splittedStr1.length; i++) { for (let j = 0; j < splittedStr2.length; j++) { // ... } }
4. 未处理重复单词的问题
即使修复了上面的问题,当同一个单词在两个字符串中多次出现时,会被重复添加到similarWords里。如果需要的是去重后的相同单词列表,还需要额外处理。
修复后的完整代码(保留重复匹配)
如果只是要收集所有匹配的单词(包括重复):
const str1 = "This is string 1"; const str2 = "This is string 2"; let similarWords = []; const splittedStr1 = str1.split(" "); const splittedStr2 = str2.split(" "); for (let i = 0; i < splittedStr1.length; i++) { for (let j = 0; j < splittedStr2.length; j++) { if (splittedStr1[i] === splittedStr2[j]) { similarWords.push(splittedStr1[i]); } } } console.log(similarWords); // 输出: ["This", "is", "string"]
去重版本的实现(获取唯一的相同单词)
如果需要的是两个字符串中都存在的唯一单词列表,可以用Set简化逻辑:
const str1 = "This is string 1"; const str2 = "This is string 2"; const set1 = new Set(str1.split(" ")); const similarWords = str2.split(" ").filter(word => set1.has(word)); // 去重(如果str2本身有重复单词) const uniqueSimilarWords = [...new Set(similarWords)]; console.log(uniqueSimilarWords); // 输出: ["This", "is", "string"]
内容的提问来源于stack exchange,提问作者dvsd9p7m
相关产品推荐
相关产品推荐

