Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Фильтр по начальным буквам слова (https://javascript.ru/forum/misc/54473-filtr-po-nachalnym-bukvam-slova.html)

Shasoft 18.03.2015 20:48

Фильтр по начальным буквам слова
 
Есть массив фраз (может быть более одного слова в фразе). На входе есть последовательность символов - требуется найти все фразы, которые содержат слова, начинающиеся с этих символов.
Может есть у кого такая функция или ссылка на исходники?

рони 18.03.2015 21:27

Shasoft,
var phrase = ['Есть массив фраз','может быть более одного слова в фразе','На входе есть последовательность символов'], word = ['ма','си'];
   function oneINother(word,phrase) {
    function c(d) {
        return word.some(function(a) {
            return (new RegExp("^" + a)).test(d)
        })
    }
    return phrase.filter(function(a) {
        return a.split(/\s+/).some(c)
    })
};

alert(oneINother(word,phrase));

Shasoft 18.03.2015 21:55

У меня вот так получилось. Создаю два RegExp и проверяю для них все фразы.
var re0 = new RegExp("[\\s|,|.]"+n, "gi");
var re1 = new RegExp("^"+n, "gi");

n - искомая последовательность символов

Shasoft 20.03.2015 15:53

var re0 = new RegExp("[\\s|,|.]"+n, "i");
var re1 = new RegExp("^"+n, "i");
Убрал 'g' в параметрах. Оно не нужно

nerv_ 20.03.2015 16:14

зачем тут вообще регулярки?
substring = lower(substring);
line = lower(line);
words = line.split(/\s+/);
for each word
    chunk = word.slice(0, substring.length);
    chunk === substring // {Boolean}

Shasoft 20.03.2015 18:29

Цитата:

line.split(/\s+/);
А это у вас, извиняюсь, что в split? Не регулярка ли? ;)

nerv_ 20.03.2015 20:51

Цитата:

Сообщение от Shasoft
А это у вас, извиняюсь, что в split? Не регулярка ли?

что в split как раз не суть. Можно пробел поставить, а можно регу, если первого не достаточно.
речь шла про сравнение

Shasoft 21.03.2015 15:01

По моему с регулярками более понятно
var re0 = new RegExp("[\\s|,|.]"+substring, "i");
var re1 = new RegExp("^"+substring, "i");
if(  re0.test(line) || re1.test(line) )
{

}
Но, как известно, на вкус и цвет... :)
Можно было по скорости сравнить, но тут только практический тест поможет

nerv_ 21.03.2015 16:08

Цитата:

Сообщение от Shasoft
По моему с регулярками более понятно

ну-ну :)
alert(new RegExp('1+2').test('1+2'));
alert(new RegExp('Вася?!').test('Вася?!'));
alert(new RegExp('Вася(Крюков)').test('Вася(Крюков)'));

Shasoft 21.03.2015 19:16

nerv_, сделал пример на plnkr.
Добавил и ваш вариант. Он не находит вариант "Грач,ВорОна,Сорока" если ввести маску "в".

Вариант с двумя RegExp переделали на один RegExp
var re = new RegExp("(^|[\\s|,|.])" + n, "i");


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