Javascript-форум (https://javascript.ru/forum/)
-   Элементы интерфейса (https://javascript.ru/forum/dom-window/)
-   -   Как проверить что все слова есть в предложении, если количество слов не известно? (https://javascript.ru/forum/dom-window/80601-kak-proverit-chto-vse-slova-est-v-predlozhenii-esli-kolichestvo-slov-ne-izvestno.html)

sovsem-nub 27.06.2020 20:30

Как проверить что все слова есть в предложении, если количество слов не известно?
 
Не знаю как внутрь if() вставить несколько условий, если заранее количество условий неизвестно.

starttext="мама и папа мыли раму хорошо, кошка мыла себя"
text="Мама мыла раму"
var arrtext=text.split(' ');

if(starttext.toLowerCase().indexOf(arrtext[0].toLowerCase()) != -1 ){alert("все слова из text присутствуют в starttext")}


в этом коде я проверяю только первое слово, а мне нужно проверить все слова в text, но количество слов в text неизвестно. Их может быть любое количество в любом порядке. Как внутрь условия добавить проверку всех слов?

laimas 27.06.2020 20:52

let text = "мама и папа мыли раму хорошо, кошка мыла себя",
    find = "Мама мыла раму".split(' ');

let re = new RegExp(find.join('|'),'gi');

let check = text.match(re).length;

alert(check == find.length ? 'All words' : check + ' words')

Vlasenko Fedor 27.06.2020 21:12

let text = "мама и папа мыли раму хорошо, кошка мыла себя";
let search = "Мама мыла раму"
let textL = text.toLowerCase();
let searchArr = search.toLowerCase().split(' ');

if (searchArr.every(v => ~textL.indexOf(v))) {
    alert("все слова из text присутствуют в starttext")
}

вариант

рони 27.06.2020 21:13

laimas,
:-?
let text = "мама мама мама",
    find = "Мама мыла раму".split(' ');

let re = new RegExp(find.join('|'),'gi');

let check = text.match(re).length;

alert(check == find.length ? 'All words' : check + ' words')

laimas 27.06.2020 21:14

Vlasenko Fedor, только как и у меня, нужно не .split(' '), а split(/\s+/), понятно почему.

laimas 27.06.2020 21:15

рони, а вот об этом я не подумал, что в исходнике могут быть дубликаты. :) Можно и удалить.

sovsem-nub 28.06.2020 12:24

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 526511)
let text = "мама и папа мыли раму хорошо, кошка мыла себя";
let search = "Мама мыла раму"
let textL = text.toLowerCase();
let searchArr = search.toLowerCase().split(/\s+/);

if (searchArr.every(v => ~textL.indexOf(v))) {
    alert("все слова из text присутствуют в starttext")
}

вариант

Спасибо. Наверное это самый быстрый вариант. как я понял (хотя я вообще ничего не понял) внутри if как то поместилась стрелочная функция, которая как-то превратится в true && true && true для каждого элемента массива. И наверное при первом false поиск уже продолжаться не будет? а волнушка ~ это как return? вот это => ~ мне напоминает египетские иероглифы...

laimas 28.06.2020 13:08

Цитата:

Сообщение от sovsem-nub
внутри if как то поместилась стрелочная функция

Не как-то, а анонимная функция (callback), параметр функции every, которая возвращает результат функции indexOf. Равно как

.....every(function(v) { return ~textL.indexOf(v) })


Эта функция возвращает -1, если не найдено, и чтобы не писать проверку на это значение и учитывая, что 0 (найдено, но в нулевой позиции), это false, проще инвертировать его ~.

console.log(~0, ~1, ~-1); //результат -1, -2, 0


что означает в первых двух случаях true (найдено), и в последнем false (нет совпадений).

рони 28.06.2020 13:12

Цитата:

Сообщение от sovsem-nub
Как проверить что все слова есть в предложении

https://javascript.ru/forum/misc/698...tml#post459300

sovsem-nub 28.06.2020 15:01

Цитата:

Сообщение от laimas (Сообщение 526519)

console.log(~0, ~1, ~-1); //результат -1, -2, 0


что означает в первых двух случаях true (найдено), и в последнем false (нет совпадений).

как понять "Инвертировать" волнушка умножает на -1 и вычитает 1?


Часовой пояс GMT +3, время: 08:30.