Проверьте, не совпадают ли слова между строками - PullRequest
0 голосов
/ 19 января 2019

Вот код, который выведет все совпадающие слова в обеих строках, если вы зарегистрируете words1 [i] . Я немного изменил код, чтобы проверить, не совпадают ли слова без успеха.давайте предположим, что у нас есть две строки:

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

Тогда вывод кода будет (на консоли):

(2) ["is", "beautiful"]

(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 голосов
/ 19 января 2019

Чтобы разрешить одни и те же значения несколько раз в результате, вы можете использовать включает

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);
0 голосов
/ 19 января 2019

Извините, но если перефразировать ваш вопрос, вы хотите сделать два массива, один из которых соответствует словам, а другой - не соответствующих слов.

Для оптимальной производительности вы можете создать своего рода хэш-карту со словами первой строки и посмотреть, есть ли на карте слова второй строки, и соответственно добавить в один из массивов результатов.

Вы можете использовать простые объекты или карту в JavaScript для макета структуры hashmap. Приведенный ниже код содержит только массив noMatchWords. Если вы хотите, чтобы и matchWords, и noMatchWords находились в одном и том же цикле, используйте метод reduce и вставьте слово в объект-накопитель с двумя массивами вместо

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']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...