Проверьте, содержит ли строка какие-либо ключевые слова, которые существуют в массиве

Я пытаюсь отфильтровать некоторый контент, основываясь на том, какое ключевое слово существует в массиве, но не уверен, как это сделать, попытался использовать includes, indexof, а также search функции, но это не сработало в моем случае.

Моя первая попытка:

const filters = ['movie', 'food']
contents
 .filter( content => filters.includes(content.name))

проблема в том, что content.name является строкой с несколькими словами, например, "посмотрите ваш любимый фильм", "проголосуйте за вашу любимую еду" и т. д., и я хочу проверить, содержит ли строка одно из ключевых слов в переменной filters. В настоящее время includes() возвращается false потому что он пытается соответствовать точной строке.

1 ответ

Решение

Вы должны проверить каждое слово в filters против каждого content.name, Вы можете сделать это с .some() который вернется true (и остановить поиск рано), когда совпадение найдено.

const filters = ['movie', 'food']
const result = contents.filter(content => 
  filters.some(s => content.name.includes(s))
)

Обратите внимание, что .includes() будет соответствовать подразделам слов. Вам нужно установить границы слов, возможно, с помощью регулярного выражения, чтобы получить полное совпадение слов.

Вы можете сделать это, создав массив регулярных выражений вместо строк, и используя .test() метод регулярных выражений.

const filters = [/\bmovie\b/, /\bfood\b/]
const result = contents.filter(content => 
  filters.some(re => re.test(content.name))
)

Добавить i модификатор для каждого регулярного выражения, если оно должно быть регистронезависимым.

Или вместо массива регулярных выражений вы можете использовать одно регулярное выражение.

const filters = /\b(?:movie|food)\b/
const result = contents.filter(content => filters.test(content.name))
Другие вопросы по тегам