Javascript lodash通过多个过滤器过滤数据

Javascript lodash通过多个过滤器过滤数据,javascript,lodash,Javascript,Lodash,我有这些数据,需要使用lodash应用所有过滤器。最终输出为空 filters=[{'gender':'M'},{'division':'police'}] 数据=[{'name':'tom','gender':'M','division':'police'}, {'name':'bob','gender':'M','division':'police'}, {'name':'dave','gender':'F','division':'IT'}, ] data=u2;.filter(数据,函

我有这些数据,需要使用lodash应用所有过滤器。最终输出为空

filters=[{'gender':'M'},{'division':'police'}]
数据=[{'name':'tom','gender':'M','division':'police'},
{'name':'bob','gender':'M','division':'police'},
{'name':'dave','gender':'F','division':'IT'},
]
data=u2;.filter(数据,函数(项){
_.forEach(过滤器,函数(过滤器){
找到的数据=u.filter([item],filter)
console.log('data\u found-',data\u found)
})        
})	

console.log(data)
您可以使用
.filter
方法以及
.every
方法根据另一个谓词集合筛选集合(我在这里使用箭头函数)。本示例还假设筛选对象只有一个键/值对,如示例中所示:

const filteredData = _.filter(data, item => {
  return _.every(filters, filter => {
    let filterKey = Object.keys(filter)[0]
    return item[filterKey] === filter[filterKey]
  })
})
一个更干净的解决方案是将过滤器组合成一个对象,并使用
\uMatches
方法进行比较:

const filter = { gender: 'M', division: 'police' }
const filteredData = _.filter(data, _.matches(filter))

可以将过滤器阵列组合到单个对象,并将其用作过滤器

combined = filters.reduce((acc,item) =>  ({...acc, ...item})) 
// combined is = {'gender':'M', 'division':'police'}

data = _.filter(data, combined)

如果您不想使用rest操作符,那么有一个lodash可以将对象数组组合成单个对象

您可以将两个过滤器组合成一个。像这样的

_.filter(data, function(item){
  if(item.gender === 'M' && item.division === 'police') return item;
})

这将为您提供所有带有性别男性和分区警察的记录

您提供给
过滤器的谓词
从不返回任何内容。他们两个都不是。编辑:我实际上很困惑应该发生什么,因为有一个foreach不断地覆盖
找到的数据
…不管是什么,最终输出应该包含所有与性别男性和警察部门的记录