这是一个代码,如果您登录 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] 不是数组,所以整个代码无法正常工作。
有什么建议吗?
答案 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']