Проверить наличие несоответствующих слов между строками

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

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

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

(2) ["есть", "красиво"]

(2) ["мир", "красивый"]

Как мы можем регистрировать несоответствие слов между строками?

Вывод должен быть массивом результатов, например:

[красивая]

Вот что я пробовал:

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.info(output);   

        }
    }
}

Кажется, поскольку слова1[я] не является множество, весь код не работает.

Какие-либо предложения?

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
86
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

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

Вы можете использовать простые объекты или карту в JavaScript, чтобы имитировать структуру хэш-карты. В приведенном ниже коде отображается только массив 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.info(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']

Произошло что-то проводное. если у меня есть это: пусть str1= 'Я был' , str2 = 'Я был'; несоответствующий вывод будет "I"

Sara Ree 19.01.2019 12:34

@ Сара Ри, но у меня let str1= 'I was' , str2 = 'I Was'; wordMap = str1.split(' ').reduce((map,word) => { map[word.toLowerCase()] = true; return map; },{}); noMatchWords = str2.split(' ').filter(word => !wordMap[word.toLowerCase()]); console.info(noMatchWords) работает, как и ожидалось

Dhananjai Pai 19.01.2019 15:47
Ответ принят как подходящий

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

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.info(res);

Или, как указал @Dhananjai Pai, создайте карта и используйте получить, чтобы проверить, имеет ли ключ значение 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.info(res);

Могу ли я включать повторяющиеся слова? скажем, если бы наши строки были var str1 = "отправлено, защитите это"; var str2 = "отправлен на землю, чтобы защитить ее"; мы хотели [на,землю,на], а не [на,землю] ???

Sara Ree 19.01.2019 13:00

@SaraRee Я добавил обновление к своему ответу, используя include.

The fourth bird 19.01.2019 13:11

Сложность здесь O(mn), где m — размер b, а n — размер a. Это тратит так много вычислений для поиска. Это можно сделать за O(m) другим методом. Для сравнения, если в каждой строке по 100 слов. Этот метод использует O (10000) сравнений, тогда как поиск требует только O (100).

Dhananjai Pai 19.01.2019 15:51

@DhananjaiPai Я обновил свой ответ, используя карту. Спасибо что подметил это.

The fourth bird 19.01.2019 16:43

Другие вопросы по теме