Фильтровать один массив с другим - PullRequest
0 голосов
/ 01 марта 2019

Я знаю, что на этот вопрос отвечали несколько раз, но я не могу найти ответ, основанный на моей ситуации.У меня есть два массива:

words ['word1', 'word2', 'word3']
texts [
    {name: 'blah', description: 'word4'},
    {name: 'blah2', description: 'word1'},
    {name: 'blah3', description: 'word5'}
]

Я пытаюсь отфильтровать два массива и вернуть true, если есть совпадение

Я видел несколько примеров простых массивов чисел, но это неподать заявку здесь.

Ответы [ 3 ]

0 голосов
/ 01 марта 2019

Я думаю, что это решит вашу проблему:

const words = ['word1', 'word2', 'word3']
const texts = [
    {name: 'blah', description: 'word4'},
    {name: 'blah2', description: 'word1'},
    {name: 'blah3', description: 'word5'}
]

function check(arra, arrb) {
return !!texts.find(_text => words.includes(_text.description))
}

console.log(check(words, texts))
0 голосов
/ 01 марта 2019

Вы можете выполнить итерацию 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))
  })
)
0 голосов
/ 01 марта 2019

Вы можете использовать фильтр и включить вместе, чтобы узнать, какое слово присутствует в объекте

var words= ['word1', 'word2', 'word3']
var texts=[
    {name: 'blah', description: 'word4'},
    {name: 'blah2', description: 'word1'},
    {name: 'blah3', description: 'word5'}
]
console.log(texts.filter((x)=>words.includes(x.description)).length>0?true:false)
...