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);

基本上,您要查找arrays中的每个项,每个项都与filters所包含的内容相匹配。

为此,您可以在filters上使用every方法,并尝试用该namefind项目并匹配value

const result = arrays.filter(item => {
return Object.entries(filters)
.every( ([key,value]) => item.parameters.find(p => p.name == key).value == value)
});

实例:

const arrays= 
[  
{ 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' } 
] } 
,  
{ 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' } 
] } 
, 
{ 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' } 
] } 
,  
{ 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' } 
] } 
, 
{ 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(item => {
return Object.entries(filters).every( ([key,value]) => item.parameters.find(p => p.name == key).value == value)
});
console.log(result);

如果您希望任何过滤条件与匹配,请使用此代码

arr.filter(el => {
const res = el.parameters.find(perameter => { 
return filters[perameter.name] == perameter.value;
});
return !!res;
});

如果希望所有筛选条件都匹配,请使用此代码。

arr.filter(el => {
const res = el.parameters.filter(perameter => { 
return filters[perameter.name] == perameter.value;
});
return res.length === Object.keys(filters).length;
});

最新更新