谁能帮我知道如何根据另一个有条件的对象过滤一组对象。
样本数组
const arrayToFilter= [ {
name: 'Arlin Schistl',
screen_name: 'aschistl1c',
followers_count: 101,
following_count: 657,
location: 'Indonesia',
verified: true,
},
{
name: 'Henka Perren',
screen_name: 'hperren1d',
followers_count: 170,
following_count: 422,
location: 'Mexico',
verified: true, }, ]
过滤对象:
const conditions=[
{
id: 'name',
operator: 'CONTAINS'
value: 'Bob',
},
{
condition:'OR',
id: 'followers_count',
operator: 'GTE'
value: 200,
},
{
condition:'AND',
id: 'following_count',
operator: 'LTE'
value: 10,
},
{
condition:'AND',
id: 'followers_count',
operator: 'GTE'
value: 150,
}
]
如果数组与按位运算符的执行顺序中的条件匹配,则该数组应返回该对象。请让我知道为此优化的代码是什么。提前致谢!
答案 0 :(得分:0)
您可以使用 every
上的 conditions
调用过滤每个项目。只需 switch
上的 operator
并使用 item[id]
与 value
进行比较。
我将第二项更改为以下内容,使其符合约束条件:
{
name: 'Bob Perren',
screen_name: 'hperren1d',
followers_count: 300,
following_count: 5,
location: 'Mexico',
verified: true,
}
const filterWithConditions = (arr, conditions) =>
arr.filter(item => conditions.every(({ id, operator, value }) => {
switch (operator) {
case 'CONTAINS' : return item[id].indexOf(value) > -1;
case 'GTE' : return item[id] >= value;
case 'LTE' : return item[id] <= value;
default : return false;
}
}));
const arrayToFilter = [{
name: 'Arlin Schistl',
screen_name: 'aschistl1c',
followers_count: 101,
following_count: 657,
location: 'Indonesia',
verified: true,
}, {
name: 'Bob Perren',
screen_name: 'hperren1d',
followers_count: 300,
following_count: 5,
location: 'Mexico',
verified: true,
}]
const conditions = [
{ id: 'name' , operator: 'CONTAINS' , value: 'Bob' },
{ id: 'followers_count' , operator: 'GTE' , value: 200 },
{ id: 'following_count' , operator: 'LTE' , value: 10 }
];
const filtered = filterWithConditions(arrayToFilter, conditions);
console.log(filtered);
.as-console-wrapper { top: 0; max-height: 100% !important; }
或者,您可以使用对象(地图)查找而不是 switch
。
const operators = {
CONTAINS : (a, b) => a.indexOf(b) > -1,
GTE : (a, b) => a >= b,
LTE : (a, b) => a <= b
}
const filterWithConditions = (arr, conditions) =>
arr.filter(item => conditions.every(({ id, operator, value }) =>
operators[operator](item[id], value)));
答案 1 :(得分:0)
您必须创建一个从字符串到运算符的映射,然后循环遍历您的数组:
const operators = { "CONTAINS" : (...) => {...} "GTE" : (...) => {...} "LTE" : (...) => {...} } let res = arrayToFilter.filter( el => { return conditions.every( cond => operators(el[id])) })