代码之家  ›  专栏  ›  技术社区  ›  user1050619

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

  •  0
  • user1050619  · 技术社区  · 4 年前

    filters = [{'gender':'M'}, {'division':'police'}]
    
    data = [{'name':'tom', 'gender':'M', 'division':'police'},
            {'name':'bob' , 'gender':'M', 'division':'police'},
            {'name':'dave' , 'gender':'F', 'division':'IT'},
            ]
    
    data = _.filter(data, function(item){			
          _.forEach(filters, function(filter){					
                data_found = _.filter([item], filter)
                console.log('data_found - ', data_found)
            })        
          })	
    
    console.log(data)

    https://jsfiddle.net/52k6170c/1/

    3 回复  |  直到 4 年前
        1
  •  0
  •   Prasanna    4 年前

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

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

    如果你不想使用rest操作符,有一个lodash function

        2
  •  0
  •   0_0    4 年前

    你可以把两个过滤器合并成一个。像这样的东西

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

    这会给你所有男女警察和警司的记录

        3
  •  0
  •   djfdev    4 年前

    你可以使用 _.filter 方法和 _.every 方法根据另一个谓词集合筛选集合(此处使用箭头函数)。此示例还假设您的筛选器对象只有一个键/值对,如您的示例所示:

    const filteredData = _.filter(data, item => {
      return _.every(filters, filter => {
        let filterKey = Object.keys(filter)[0]
        return item[filterKey] === filter[filterKey]
      })
    })
    

    _.matches 比较方法:

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