由另一个过滤器数组创建的Javascript过滤器数组

由另一个过滤器数组创建的Javascript过滤器数组,javascript,Javascript,我有一个filtersArray,它是一堆{id,value},我想过滤我的数据,也就是JSON对象数组,以便只返回与所有过滤器匹配的元素?有没有比使用for循环遍历每个过滤器的arrayoffilter并对每个条件进行过滤更好的方法 数据是JSON对象的数组-即 [{formID:1234, name:"sam", email:"sam@gmail.com", status:"open", phone: "333-444-5555"}, {formID:2155, name:"charlie

我有一个filtersArray,它是一堆{id,value},我想过滤我的数据,也就是JSON对象数组,以便只返回与所有过滤器匹配的元素?有没有比使用for循环遍历每个过滤器的arrayoffilter并对每个条件进行过滤更好的方法

数据是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)...
}
它不能很好地工作,因为criteria是一个JSON对象,比如{status:closed},{name:charlie}

const result = arrayOfData.filter( 
                     data => arrayOfFilters.map(d =>d.status).includes(data.status))&& 
                             arrayOfFilters.map(d =>d.name).includes(data.name))&&
                             arrayOfFilters.map(d =>d.address).includes(data.address) )
                                 )


如果id是唯一的,您可以执行以下操作:

const filteredArray = arrayOfData.filter( data => arrayOfFilters.map( filter => filter.id ).includes( data.id ) )

如果id是唯一的,您可以执行以下操作:

const filteredArray = arrayOfData.filter( data => arrayOfFilters.map( filter => filter.id ).includes( data.id ) )

如果要查找源数组的所有项,并且这些项的所有属性都与筛选器数组的某些项匹配,则可以这样做:

const srcArr=[{formID:1234,姓名:sam,电子邮件:sam@gmail.com,状态:打开,电话:333-444-5555},{formID:2155,姓名:charlie,电子邮件:charlie@gmail.com,状态:关闭,电话:888-323-1234}], filterArr=[{状态:'closed',名称:'charlie'}], 结果=srcArr.filtersrcItem=> filterArr.somefilterItem=> Object.entriesfilterItem.every[filterKey,filterValue]=> srcItem[filterKey]==filterValue console.logresult
.as console wrapper{min height:100%}如果要查找源数组中所有属性都与筛选器数组中的某个项匹配的所有项,您可以这样做:

const srcArr=[{formID:1234,姓名:sam,电子邮件:sam@gmail.com,状态:打开,电话:333-444-5555},{formID:2155,姓名:charlie,电子邮件:charlie@gmail.com,状态:关闭,电话:888-323-1234}], filterArr=[{状态:'closed',名称:'charlie'}], 结果=srcArr.filtersrcItem=> filterArr.somefilterItem=> Object.entriesfilterItem.every[filterKey,filterValue]=> srcItem[filterKey]==filterValue console.logresult
.作为控制台包装器{min height:100%}我相信您需要它,在filters对象中找到键,并将其与您在数据对象中遇到的每个记录进行比较。一旦有了密钥,就可以轻松地检查值

常量数组过滤器=[{ id:1, 姓名:“山姆” }, { id:1, 状态:“打开” }, { id:1, 姓名:“安娜” }]; 常数数据=[{ formID:1234, 姓名:山姆,, 电邮:sam@gmail.com, 状态:开放, 电话:333-444-5555 }, { formID:1234, 姓名:玛拉, 电邮:sam@gmail.com, 状态:开放, 电话:333-444-5555 }, { formID:1234, 姓名:欧根, 电邮:eugen@gmail.com, 状态:关闭, 电话:333-444-5555 }, { formID:1234, 姓名:凯文, 电邮:eugen@gmail.com, 状态:关闭, 电话:333-444-5555 }, { formID:1234, 姓名:安娜, 电邮:eugen@gmail.com, 状态:关闭, 电话:333-444-5555 } ] const result=data.filterx=>{ 返回arrayToFilter.somey=>{ const key=Object.keysy[1]; 返回y[键]==x[键] } };
console.logresult我相信您需要它,在filters对象中找到键,并将其与您在数据对象中遇到的每条记录进行比较。一旦有了密钥,就可以轻松地检查值

常量数组过滤器=[{ id:1, 姓名:“山姆” }, { id:1, 状态:“打开” }, { id:1, 姓名:“安娜” }]; 常数数据=[{ formID:1234, 姓名:山姆,, 电邮:sam@gmail.com, 状态:开放, 电话:333-444-5555 }, { formID:1234, 姓名:玛拉, 电邮:sam@gmail.com, 状态:开放, 电话:333-444-5555 }, { formID:1234, 姓名:欧根, 电邮:eugen@gmail.com, 状态:关闭, 电话:333-444-5555 }, { formID:1234, 姓名:凯文, 电邮:eugen@gmail.com, 状态:关闭, 电话:333-444-5555 }, { formID:1234, 姓名:安娜, 电邮:eugen@gmail.com, 状态:关闭, 电话:333-444-5555 } ] const result=data.filterx=>{ 返回arrayToFilter.somey=>{ const key=Object.keysy[1]; 返回y[键]==x[键] } };
console.LogResults到目前为止您在编码方面做了哪些尝试可以显示您的阵列更新了更多详细信息请添加过滤器阵列的示例。为什么需要检查所有条件,我认为有一个id是用于此目的的…显示您迄今为止在编码方面做了哪些尝试可以显示您的阵列更新了更多细节请添加过滤器阵列的示例。为什么您需要检查所有条件,我认为有一个id是用于此目的的…谢谢hamid。我遇到的问题是,是否有空的criteria属性,比如no name。也就是说,如果ArrayOffilter有一个状态或地址,但没有名称,那么即使其他属性与该对象匹配,该过滤器也不会返回该对象。有没有办法更动态地使用映射、过滤器和其他数组函数而不是使用for循环来实现这一点?这取决于查看空的criteria属性后要执行的操作。谢谢hamid。我
我遇到的问题是,是否有一个空的criteria属性,比如no name。也就是说,如果ArrayOffilter有一个状态或地址,但没有名称,那么即使其他属性与该对象匹配,该过滤器也不会返回该对象。有没有一种方法可以更动态地使用映射、过滤器和其他数组函数而不是使用for循环来实现这一点?这取决于查看空的criteria属性后要执行的操作。仔细看,答案有点不正确。filterArr是一个字符串对象数组,而它应该是一个对象数组,每个对象都有一个单独的字符串。ie[{status:closed},{name:charlie},{id:2155}…]@Linkx_lair:如果源数组对象应该与filterArr的每个对象匹配,只需用每个对象替换一些即可。你真的不需要撤销你的接受,我很乐意用以上的解决方案支持你,所以这个评论足够吸引我的注意;仔细看,答案有点离题。filterArr是一个字符串对象数组,而它应该是一个对象数组,每个对象都有一个单独的字符串。ie[{status:closed},{name:charlie},{id:2155}…]@Linkx_lair:如果源数组对象应该与filterArr的每个对象匹配,只需用每个对象替换一些即可。你真的不需要撤销你的接受,我很乐意用以上的解决方案支持你,所以这个评论足够吸引我的注意;我想从符合arrayToFilter中所有条件的数据中获取对象数组。arrayToFilter中有一个冗余的“name”属性-这将导致不匹配,因为它是一个无效的筛选器。除此之外,它看起来非常有趣。我想从符合arrayToFilter中所有条件的数据中获取一个对象数组。arrayToFilter中有一个冗余的“name”属性-这将导致不匹配,因为它是一个无效的筛选器。除此之外,它看起来真的很有趣