Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сравнить 2 строки и если есть хотя бы одно общее слово, то true (https://javascript.ru/forum/misc/66506-kak-sravnit-2-stroki-i-esli-est-khotya-odno-obshhee-slovo-true.html)

sovsem-nub 19.12.2016 19:08

Как сравнить 2 строки и если есть хотя бы одно общее слово, то true
 
есть 4 строки


text1="мама мыла раму [[совсем другую раму]] папу"
text2="раму вертолет"
text3="другую"
text4="[[совсем другую раму]]"


нужно сравнить 2 строки и если есть хоть одно совпадающее слово вернуть true. При этом слово в квадратных скобках это целиком одно слово и пробел в нем не считается разделителем слова (скобки это тоже часть слова). То есть сравнивая

text1 и text2 мы должны получить true
а если text1 и text3 получаем false
если text2 и text3 false
text1 и text4 true (слова с пробелами всегда в квадратных скобках)


наверное мы должны как-то загнать значения в массив

рони 19.12.2016 19:43

sovsem-nub,
:-?
var text1="мама мыла раму [[совсем другую раму]] папу",
text2="раму вертолет",
text3="другую",
text4="[[совсем другую раму]]";
function foo(a, b) {
    var c = /[^\[\]\s]+|(\[\[[\s\S]*?\]\])/g;
    a = a.match(c) || [];
    b = b.match(c) || [];
    return a.some(function(a) {
        return b.some(function(b) {
            return b == a
        })
    })
};
alert(foo(text1,text2));  //true
alert(foo(text1,text3));  //false
alert(foo(text2,text3));  //false
alert(foo(text1,text4));  //true

sovsem-nub 19.12.2016 20:22

:( вообще не понимаю как это работает
вы берете две строки, переделываете их в 2 массива a и b

а потом как-то сравниваете эти массивы через

return a.some(function(a) {
return b.some(function(b) {
return b == a
})
})

что такое return b == a ?
что такое a.some(function(a) "a" это же массив.
b == a вернет true, если они равны, но как в них отдельное слово попало из массива?

и тут нет никакого перебора. взяли один элемент из первого, сравнили с элементом из второго.

рони 19.12.2016 20:57

Цитата:

Сообщение от sovsem-nub
и тут нет никакого перебора. взяли один элемент из первого, сравнили с элементом из второго.

тут перебор и есть, сравниваются все элементы первого массива со всеми другого, если хотбы одно сравнение подошло условию, перебор прекращается возвращается true, иначе false.
https://learn.javascript.ru/array-iteration#every-some

sovsem-nub 19.12.2016 22:15

Спасибо. Много я еще не знаю.

рони 19.12.2016 23:15

sovsem-nub,
тоже самое, может так проще будет понять ...
var text1="мама мыла раму [[совсем другую раму]] папу",
text2="раму вертолет",
text3="другую",
text4="[[совсем другую раму]]";
function foo(a, b) {
    var c = /[^\[\]\s]+|(\[\[[\s\S]*?\]\])/g;
    a = a.match(c) || [];
    b = b.match(c) || [];
    for (var i = 0; i < a.length; i++) {
        for (var k = 0; k < b.length; k++) {
            if (a[i] == b[k]) return true
        }
    }

    return false
};
alert(foo(text1,text2));  //true
alert(foo(text1,text3));  //false
alert(foo(text2,text3));  //false
alert(foo(text1,text4));  //true


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