如何根据Javascript中的另一个对象过滤对象数组

时间:2021-05-07 17:27:02

标签: javascript arrays

谁能帮我知道如何根据另一个有条件的对象过滤一组对象。

样本数组

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,
    } 
  ]

如果数组与按位运算符的执行顺序中的条件匹配,则该数组应返回该对象。请让我知道为此优化的代码是什么。提前致谢!

2 个答案:

答案 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]))
})
相关问题