用另一个过滤一个数组

时间:2019-03-01 18:51:50

标签: javascript arrays array-filter

我知道这个答案已经被多次回答了,但是我似乎无法根据自己的情况找到答案。我有两个数组:

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

我试图过滤两个数组,如果匹配则返回true

我已经看到了一些简单的数字数组示例,但这不适用于此处。

3 个答案:

答案 0 :(得分:3)

您可以使用Array.prototype.some()迭代texts,并使用Array.prototype.includes()检查words中的匹配项。如果wordstexts的长度分别为nm,则这是O(nm)时间复杂度。

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))
  })
)

如果您的单词也包含非字母数字字符,我高度建议您借用this function以正确避开正则表达式。如果不逃避它们,可能会遇到以下情况,导致代码抛出错误或提供错误的结果。

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))
  })
)

答案 1 :(得分:2)

您可以使用过滤器并将其包括在一起以了解对象中存在哪个单词

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)

答案 2 :(得分:1)

我认为这可以解决您的问题:

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))