JS 对象数组根据多个条件过滤

比如有个 数组`let array = [

{
  date: '2016-05-02',
  name: 'Ethan',
  status: 'success',
  total: '81'
},
{
  date: '2016-05-04',
  name: 'Lynn',
  status: 'fail',
  tag: '50'
},
{
  date: '2016-05-01',
  name: 'Kevin',
  status: 'success',
  tag: '20'
}]`

过滤条件:`let filters = {

  name: ['Lynn', 'Kevin'],
  status: ['success']
}`

想要的结果是同时满足 name 是 Lynn或者Kevin 同时 status是success的数据
请问怎么写比较有效率 谢谢


补充内容:

研究了一会
最初是这样的 后来感觉太麻烦

     this.array.filter( item => {
          for(let i = 0; i< this.filters.length; i++) {
            console.log(i)
             if(item.name === this.filters[i]) {
               return true
             }
          }
          return false           
        }).filter(.....)

现在的做法

array.filter(item => {
        return (filters.name.length === 0 ? true : filters.name.indexOf(item.name) !== -1) &&
          (filters.tag.length === 0 ? true : filters.tag.indexOf(item.tag) !== -1)
      })

js初学, 希望有更好的方法

阅读 10.1k
3 个回答
let keys = Object.keys(filters)
let result = array.filter(item => {
  return keys.every(key => filters[key].indexOf(item[key]) !== -1)
})
let array = [
{
  date: '2016-05-02',
  name: 'Ethan',
  status: 'success',
  total: '81'
},
{
  date: '2016-05-04',
  name: 'Lynn',
  status: 'fail',
  tag: '50'
},
{
  date: '2016-05-01',
  name: 'Kevin',
  status: 'success',
  tag: '20'
}];
let filterStatus = "success";
let filterNames = ['Lynn', 'Kevin'];
let result = array.filter((a,i)=>{
    return ( a.status === filterStatus && filterNames.some(f=>(f === a.name)) ) 
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏