Вы можете выполнить итерацию texts
, используя Array.prototype.some()
, и проверить совпадения в words
, используя Array.prototype.includes()
.Это сложность времени O (нм), если длины words
и texts
равны n
и m
соответственно.
const words = ['word1', 'word2', 'word3']
const texts = [
{name: 'blah', description: 'word4'},
{name: 'blah2', description: 'word1'},
{name: 'blah3', description: 'word5'}
]
console.log(
texts.some(
({ description }) => words.includes(description)
)
)
Другое решение, в котором O (n + m) временная сложность использует вместо этого Set.prototype.has()
, но этот подход, вероятно, будет пренебрежимо быстрее или даже немногомедленнее, если words
- маленький массив, поэтому используйте его, только если words
очень большой.
const words = new Set(['word1', 'word2', 'word3'])
const texts = [
{name: 'blah', description: 'word4'},
{name: 'blah2', description: 'word1'},
{name: 'blah3', description: 'word5'}
]
console.log(
texts.some(
({ description }) => words.has(description)
)
)
Обновление
Для решения вашей проблемы чувствительности к регистру я рекомендую несколько иной подход.Поскольку оба массива будут содержать слова со смешанным регистром, преобразуйте один из массивов в регулярные выражения и проверьте каждое регулярное выражение для всех слов в другом массиве с помощью флага без учета регистра.
const words = ['word1', 'WORD2', 'Word3']
const texts = [
{name: 'blah', description: 'Word4'},
{name: 'blah2', description: 'Word1'},
{name: 'blah3', description: 'Word5'}
]
console.log(
texts.some(({ description }) => {
const regexp = new RegExp(description, 'i')
return words.some(word => regexp.test(word))
})
)
Если ваши слова также содержат не алфавитно-цифровые символы, я весьма предлагаю вам заимствовать эту функцию , чтобы избежать регулярных выраженийдолжным образом.Если вы не избежите их, вы можете столкнуться с приведенными ниже примерами, которые приводят к тому, что ваш код выдает ошибки или дает неверные результаты.
function escapeRegExp(text) {
return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&');
}
const words = ['?WORD1', 'word2', 'Word3']
const texts = [
{name: 'blah', description: 'Word4'},
{name: 'blah2', description: '?Word1'},
{name: 'blah3', description: 'Word5'}
]
console.log(
texts.some(({ description }) => {
const regexp = new RegExp(escapeRegExp(description), 'i')
return words.some(word => regexp.test(word))
})
)