javascript - 具有多个条件的Javascript过滤器数组whitin数组
问题描述
这是我从服务器得到的结果。
arrays=
[ 0:
{ Id: 1
, name: 'test1'
, parameters:
[ { name: 'application_instance', value: 'home', type: 'generic' }
, { name: 'application_name', value: 'initial', type: 'generic' }
, { name: 'application_role', value: 'disk_init_role', type: 'generic' }
, { name: 'customer_environment', value: 'development', type: 'generic' }
, { name: 'customer_name', value: 'guest', type: 'generic' }
] }
, 1:
{ Id: 2
, name: 'test2'
, parameters:
[ { name: 'application_instance', value: 'home', type: 'generic' }
, { name: 'application_name', value: 'disk_init', type: 'generic' }
, { name: 'application_role', value: 'initial', type: 'generic' }
, { name: 'customer_environment', value: 'development', type: 'generic' }
, { name: 'customer_name', value: 'guest', type: 'generic' }
] }
, 2:
{ Id: 3
, name: 'test3'
, parameters:
[ { name: 'application_instance', value: 'home', type: 'generic' }
, { name: 'application_name', value: 'initial', type: 'generic' }
, { name: 'application_role', value: 'initial', type: 'generic' }
, { name: 'customer_environment', value: 'development', type: 'generic' }
, { name: 'customer_name', value: 'guest', type: 'generic' }
] }
, 3:
{ Id: 4
, name: 'test4'
, parameters:
[ { name: 'application_instance', value: 'home', type: 'generic' }
, { name: 'application_name', value: 'initial', type: 'generic' }
, { name: 'application_role', value: 'disk_init_role', type: 'generic' }
, { name: 'customer_environment', value: 'development', type: 'generic' }
, { name: 'customer_name', value: 'guest', type: 'generic' }
] }
, 5:
{ Id: 5
, name: 'test5'
, parameters:
[ { name: 'application_instance', value: 'home', type: 'generic' }
, { name: 'application_name', value: 'initial_disk_init', type: 'generic' }
, { name: 'application_role', value: 'disk_initial', type: 'generic' }
, { name: 'customer_environment', value: 'development', type: 'generic' }
, { name: 'customer_name', value: 'guest', type: 'generic' }
]
}
]
我需要用多个条件过滤它。
filters = {
application_name: 'initial',
application_role: 'disk_init_role'
}
我制作了一个过滤数据的功能,但这仅适用于一个条件
filterArray (array, filters) {
for (var [key, value] of Object.entries(filters)) {
const res = Object.values(array).filter(
item => item.parameters.some(param => param.name === `${key}` && param.value === `${value}`)
)
return results
}
}
遍历数组以便满足两个条件(过滤器)的最佳方法是什么?结果只需要 id 1 和 4 并且需要在返回结果数组中。
解决方案
这会将所有过滤器应用于每个数组元素。只有满足所有过滤条件时,才会将数组元素添加到结果数组中。
const arrays= [
{
"0": {
"Id": 1,
"name": "test1",
"parameters": [
{
"name": "application_instance",
"value": "home",
"type": "generic"
},
{
"name": "application_name",
"value": "initial",
"type": "generic"
},
{
"name": "application_role",
"value": "disk_init_role",
"type": "generic"
},
{
"name": "customer_environment",
"value": "development",
"type": "generic"
},
{
"name": "customer_name",
"value": "guest",
"type": "generic"
}
]
}
},
{
"1": {
"Id": 2,
"name": "test2",
"parameters": [
{
"name": "application_instance",
"value": "home",
"type": "generic"
},
{
"name": "application_name",
"value": "disk_init",
"type": "generic"
},
{
"name": "application_role",
"value": "initial",
"type": "generic"
},
{
"name": "customer_environment",
"value": "development",
"type": "generic"
},
{
"name": "customer_name",
"value": "guest",
"type": "generic"
}
]
}
},
{
"2": {
"Id": 3,
"name": "test3",
"parameters": [
{
"name": "application_instance",
"value": "home",
"type": "generic"
},
{
"name": "application_name",
"value": "initial",
"type": "generic"
},
{
"name": "application_role",
"value": "initial",
"type": "generic"
},
{
"name": "customer_environment",
"value": "development",
"type": "generic"
},
{
"name": "customer_name",
"value": "guest",
"type": "generic"
}
]
}
},
{
"3": {
"Id": 4,
"name": "test4",
"parameters": [
{
"name": "application_instance",
"value": "home",
"type": "generic"
},
{
"name": "application_name",
"value": "initial",
"type": "generic"
},
{
"name": "application_role",
"value": "disk_init_role",
"type": "generic"
},
{
"name": "customer_environment",
"value": "development",
"type": "generic"
},
{
"name": "customer_name",
"value": "guest",
"type": "generic"
}
]
}
},
{
"5": {
"Id": 5,
"name": "test5",
"parameters": [
{
"name": "application_instance",
"value": "home",
"type": "generic"
},
{
"name": "application_name",
"value": "initial_disk_init",
"type": "generic"
},
{
"name": "application_role",
"value": "disk_initial",
"type": "generic"
},
{
"name": "customer_environment",
"value": "development",
"type": "generic"
},
{
"name": "customer_name",
"value": "guest",
"type": "generic"
}
]
}
}
];
const filters = {
application_name: 'initial',
application_role: 'disk_init_role'
};
const result = arrays.filter((e) => {
const parameters = e[Object.keys(e)[0]].parameters;
let match = true;
Object.keys(filters).forEach((f) => {
const parameter = parameters.find((g) => g.name === f);
match = match && parameter.value === filters[f];
});
return match;
});
console.log(result);
推荐阅读
- abap - SELECT FROM @itab 导致语法错误。为什么?
- ios - iOS 上的 AWS Transcribe 错误:找不到具有指定主机名的服务器
- php - 用于 SQL Server 的 insert ignore into 的替代方案
- r - ggpubr:在标签中显示显着性水平(*** 或 ns)而不是 p 值
- python - 交换 PANDAS 数据框中的元素
- python - 如何在 SQLAlchemy 中将 pool_timeout 设置为无穷大?
- python - 如何在 Windows 上安装 libffi-dev 和 libssl-dev
- admob - Admob 广告将在两周后开始展示
- java - 当 url 包含大括号字符时 Spring-boot 控制器错误
- excel - Excel VBA 2010:VBA 保存工作簿时数据验证中断,但手动保存时不会中断