使用多个过滤器值过滤对象

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用多个过滤器值过滤对象相关的知识,希望对你有一定的参考价值。

我有一个对象,该对象具有三个不同的数组,例如location Vertical和roundType,我将得到一个过滤器对象,该对象在该对象中具有相同的三个数组。这是需要过滤的数据

testObject = [{
    "id": 1892928,
    "vertical_tax": [
      678,
      664
    ],
    "location_tax": [
      666
    ],
    "roundType": [
      "rt1"
    ],
}
{
    "id": 1892927,
    "vertical_tax": [
      662,
      663
    ],
    "location_tax": [
       663
    ],
    "roundType": [
      "rt2"
    ],
}]

这是应该基于其进行过滤的过滤器对象

 filterObject = {
    locations: [666,667]
    roundTypes: ["rt1","rt2"]
    verticals: [662,661]
   }

所以我需要使用在filterObject中传递的值来过滤主对象。因此,如果filterobject具有location:[666,667],则应该在主对象中返回所有在其location数组中包含666的id。

答案

您可以过滤对象,而只排除它们。我已注释掉部分比较,因为尚不清楚是否要筛选这些属性以及筛选方式。您只提到了位置。如果您希望它包括所有属性的所有匹配结果,请将&&更改为||。如前所述,如果属性匹配(或具有一致的命名),则可以简化和泛化代码。

testObject = [{
    "id": 1892928,
    "vertical_tax": [
      678,
      664
    ],
    "location_tax": [
      666
    ],
    "roundType": [
      "rt1"
    ],
},
{
    "id": 1892927,
    "vertical_tax": [
      662,
      663
    ],
    "location_tax": [
       663
    ],
    "roundType": [
      "rt2"
    ],
}]

 filterObject = {
    locations: [666,667],
    roundTypes: ["rt1","rt2"],
    verticals: [662,661]
   };
   
console.log(
testObject.filter(obj => 
  obj.location_tax.some(x=>filterObject.locations && filterObject.locations.includes(x)) ||
  obj.roundType.some(x=>filterObject.roundTypes && filterObject.roundTypes.includes(x)) ||
  obj.vertical_tax.some(x=>filterObject.verticals && filterObject.verticals.includes(x))
)


 filterObject = {
    roundTypes: ["rt1","rt2"],
    verticals: [662,661]
   };
   
   
console.log(
testObject.filter(obj => 
  obj.location_tax.some(x=>filterObject.locations && filterObject.locations.includes(x)) ||
  obj.roundType.some(x=>filterObject.roundTypes && filterObject.roundTypes.includes(x)) ||
  obj.vertical_tax.some(x=>filterObject.verticals && filterObject.verticals.includes(x))
)
)
另一答案

如果只想测试一个条件,只需使用该语句并丢弃其余条件,或者如果要使任一条件都为真以获取结果,则将&&逻辑更改为||。以获取必要的说明。

testObject.filter( i => {
return i.vertical_tax.every((value, index) => value === filterObject.verticals[index]) &&
  i.location_tax.every((value, index) => value === filterObject.locations[index]) && 
i.roundType.every((value, index) => value === filterObject.roundTypes[index]);
});

以上是关于使用多个过滤器值过滤对象的主要内容,如果未能解决你的问题,请参考以下文章

是否建议使用多个 django 过滤器?

使用多个条件过滤对象,包括比较两个对象字段

Angular Material - 通过多个过滤器和多个过滤器值同时过滤表

如何使用 AngularJS 对多个对象应用过滤器?

基于多值对象过滤javascript对象数组

Spring数据mongodb过滤字符串集合中的嵌套对象ID