检查字符串之间的单词是否不匹配

时间:2019-01-19 11:10:48

标签: javascript html html5

这是一个代码,如果您登录 words1 [i] ,它将在两个字符串中输出所有匹配的单词。我稍稍更改了代码,以检查是否没有匹配的单词没有成功。假设我们有两个字符串:

var str1 = "world is beautiful";
var str2 = "is world butiful";

然后代码的输出将是(在控制台上):

(2)[“是”,“美丽”]

(2)[[world],“ beautiful”]

我们如何记录字符串之间不匹配的单词?

输出应为结果数组,例如:

[美丽]

这是我尝试过的:

var str1 = "world is beautiful";
var str2 = "is world bautiful";

var words1 = str1.split(/\s+/g),
    myArray = str1.split(/\s+/g),
    words2 = str2.split(/\s+/g),
    i,
    j;

for (i = 0; i < words1.length; i++) {
    for (j = 0; j < words2.length; j++) {
        if (words1[i].toLowerCase() == words2[j].toLowerCase()) {

        output = myArray.filter( ( el ) => !words1[i].includes( el ) );
        console.log(output);   

        }
    }
}

似乎因为 words1 [i] 不是数组,所以整个代码无法正常工作。

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

要在结果中多次允许相同的值,可以使用includes

let a = "sent erth protect it".split(' ');
let b = "sent to earth to protect it".split(' ');
let res = b.filter(i => !a.includes(i));
console.log(res);

或者如@Dhananjai Pai所指出的那样,创建一个Map并使用get来检查键的值是否为true

let map = new Map();
"sent erth protect it".split(' ').forEach(x => map.set(x, true));
let res = "sent to earth to protect it".split(' ').filter(x => !map.get(x));
console.log(res);

答案 1 :(得分:2)

很抱歉,但是想改一下您的问题,您想制作两个数组,一个匹配单词,另一个不匹配单词。

为了获得最佳性能,您可以使用第一个字符串的单词创建一个排序哈希表,查看第二个字符串的单词是否在映射中,并相应地添加到任何一个结果数组中。

您可以使用简单的对象或JavaScript中的Map来模拟哈希图结构。以下代码仅列出了noMatchWords数组。如果您希望matchWords和noMatchWords都在同一个循环中,请使用reduce方法,并使用两个数组将word推入累加器对象

let str1= 'world is beautiful' , str2 = 'is world butiful';
wordMap = str1.split(' ').reduce((map,word) => { map[word.toLowerCase()] = true; return map; },{});
noMatchWords = str2.split(' ').filter(word => !wordMap[word.toLowerCase()]);
console.log(noMatchWords) // prints ['butiful'] since it is not in the first string. You can replace str1 and str2 in the steps 2 and 3 if you want to print words in str1 and not in str2 ie, get ['beautiful']