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 шт):
Используйте регулярные выражения с модификатором 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);
}
Для определения того, что одна строка начинается с другой можно воспользоваться методом .startsWith
Для проверки наличия в массиве элемента, удовлетворяющего какому-либо условию можно воспользоваться методом .some
В итоге код может выглядеть так:
let isFiltered: boolean = words.some(word => word.toLowerCase().startsWith(filterPrepared))