首页 > 解决方案 > 另一个过滤器数组的Javascript过滤器数组

问题描述

我有一个filtersArray,它是一堆{id,value},我想过滤我的数据(也是JSON对象数组)以仅取回与所有过滤器匹配的元素?有没有比使用 for 循环对每个过滤器遍历 arrayOfFilters 并在每个条件上执行过滤器更好的方法?

数据是 JSON 对象的数组 - 即

[{formID:1234, name:"sam", email:"sam@gmail.com", status:"open", phone: "333-444-5555"},
 {formID:2155, name:"charlie", email:"charlie@gmail.com", status:"closed", phone: "888-323-1234"},...]

和过滤器数组[{"status":"closed"}, {"name":"charlie"}, {"id":2155}...]

我试过做

for(var criteria in arrayOfFilters){
   this.data = this.data.filter( d => d.status === criteria.status)
                    .filter(d => d.name === criteria.name)
                    .filter(d => d.address === criteria.address)...
}

它不能很好地工作,因为条件是一个 JSON 对象,例如 {"status":"closed"}, {"name":"charlie"}...

标签: javascript

解决方案


如果想法是找到与过滤器数组的某些项匹配(按所有属性)的源数组的所有项,则可以这样:

const srcArr = [{formID:1234,name:"sam",email:"sam@gmail.com",status:"open",phone:"333-444-5555"},{formID:2155,name:"charlie",email:"charlie@gmail.com",status:"closed",phone:"888-323-1234"}],
      filterArr = [{status:'closed', name:'charlie'}],
      result = srcArr.filter(srcItem => 
                  filterArr.some(filterItem => 
                    Object.entries(filterItem).every(([filterKey, filterValue]) => 
                      srcItem[filterKey] == filterValue)))
    
console.log(result)
.as-console-wrapper {min-height:100%}

如果您的过滤器是一个普通对象,那就更简单了:

const srcArr = [{formID:1234,name:"sam",email:"sam@gmail.com",status:"open",phone:"333-444-5555"},{formID:2155,name:"charlie",email:"charlie@gmail.com",status:"closed",phone:"888-323-1234"}],
      filterObj = {name:'charlie', status:'closed'}
      result = srcArr.filter(srcItem => 
                Object.entries(filterObj).every(([filterKey, filterVal]) => 
                  srcItem[filterKey] == filterVal))
      
console.log(result)
.as-console-wrapper {min-height:100%}


推荐阅读