javascript - 另一个过滤器数组的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"}...
解决方案
如果想法是找到与过滤器数组的某些项匹配(按所有属性)的源数组的所有项,则可以这样:
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%}
推荐阅读
- python - 检查泡菜转储的依赖关系
- unity3d - 使用没有 Canvas 的输入字段,或找到任何替代方法
- linux - 从列表中选择文件
- javascript - 从动态生成的列表中动态选择元素
- python - 无法执行脚本 pygame 错误 dist 不起作用
- node.js - 使用客户端进行嵌套查询
- gitlab-ci - 为什么我关心哪个 gitlab runner 运行我的管道
- reactjs - ReactApp 中缺少 serviceWorker
- javascript - 关于 jQuery hover()、setInterval 范围和“this”问题的问题 ---
- reactjs - 将根目录重定向到 /path/ 用于单页应用程序和 NGINX