javascript: фильтрация строк с помощью маски

стоит задача - есть маска-фильтр (строка) и строка слов (ФИО), требуется определить хотя бы одно из слов в строке покрывается маской, т.е. совпадает ли маска с началом слова (без учёта регистра слов)

написал такой работающий код:

// применить фильтр
const words: Array<string> = obj.value.split(" ");

const filterPrepared: string = this.state.filter.toLowerCase().trim();

let isFiltered: boolean = false;

for (const word of words) {

    const wordPrepared: string = word.substring(0, filterPrepared.length).toLowerCase();

    if ((word.length >= filterPrepared.length) && (filterPrepared.localeCompare(wordPrepared) === 0))
        isFiltered = true;
}

все хорошо работает, но такой вопрос - не слишком ли сложно ли, может в JS есть нормальные встроенные средства, чтобы сделать все более коротко и красиво?


Ответы (2 шт):

Автор решения: Anton Shchyrov

Используйте регулярные выражения с модификатором i. Тогда поиск будет регистронезависимым. А чтобы искало только в начале слов добавьте к фильтру конструкцию (^| ). Что будет означать искать или с начала строки, или с пробела

const filter = 'ABC';
const testWords = [
  'abc def',
  'ab abcdef',
  'ab deabc'
];

for (let i = 0; i < testWords.length; i++) {
  const isFiltered = testWords[i].match(new RegExp('(^| )' + filter, 'i')) !== null;
  console.log(testWords[i], isFiltered);
}

→ Ссылка
Автор решения: Grundy

Для определения того, что одна строка начинается с другой можно воспользоваться методом .startsWith

Для проверки наличия в массиве элемента, удовлетворяющего какому-либо условию можно воспользоваться методом .some

В итоге код может выглядеть так:

let isFiltered: boolean = words.some(word => word.toLowerCase().startsWith(filterPrepared))
→ Ссылка