【问题标题】:Filtering an object with multiple filter values使用多个过滤器值过滤对象
【发布时间】:2020-04-29 15:10:38
【问题描述】:

我有一个对象,它具有三个不同的数组,例如位置垂直和圆形类型,我将获得一个过滤器对象,该对象将在该对象中具有相同的三个数组。这是需要过滤的数据

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中的所有条件都应该匹配。应该返回所有匹配的 id。这可以用“每个”来完成

【问题讨论】:

  • 你能重新提出这个问题吗?
  • 所以我需要使用 filterObject 中传递的值来过滤主对象。因此,如果 filterobject 具有 location:[666,667] 那么在主对象中,所有那些在其位置数组中包含 666 的 id 都应该返回
  • 属性匹配会更简单

标签: javascript reactjs


【解决方案1】:

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

filterObjects 过滤存在的任何匹配项。
filterObjects1 要求存在verticals 中的所有元素,以及其他属性中的任何匹配项。

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]
   };
   
   const filterObjects = (filterObject, testObject) => {
    return testObject.filter(obj => 
      obj.location_tax && obj.location_tax.some(
        x => filterObject.locations && filterObject.locations.includes(x)) ||
      obj.roundType && obj.roundType.some(
        x => filterObject.roundTypes && filterObject.roundTypes.includes(x)) ||
      obj.vertical_tax && obj.vertical_tax.some(
        x => filterObject.verticals && filterObject.verticals.includes(x))
    );
   };
   console.log(filterObjects(filterObject, testObject));


 filterObject = {
    roundTypes: ["rt1","rt2"],
    verticals: [662,661]
 };

   console.log(filterObjects(filterObject, testObject));

   // require presence of all objects in filterObject.verticals using .every
   const filterObjects1 = (filterObject, testObject) => {
    return testObject.filter(obj => 
      (obj.location_tax && obj.location_tax.some(
        x => filterObject.locations && filterObject.locations.includes(x)) ||
       obj.roundType && obj.roundType.some(
        x => filterObject.roundTypes && filterObject.roundTypes.includes(x)) 
      ) &&
      filterObject.verticals.every( x => obj.vertical_tax && obj.vertical_tax.includes(x) )
    );
   };

 filterObject = {
    roundTypes: ["rt1","rt2"],
    verticals: [662,663]
   };
   delete testObject[0].vertical_tax;
  
   console.log(filterObjects1(filterObject, testObject));

// 必须匹配所有filterObject属性中的某个值存在

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,678]
   };
   
   // _must_ match some value in _all_ filterObject properties _that exist_
   
   const filterObjects = (filterObject, testObject) => {
    return testObject.filter(obj => 
      (!filterObject.locations || obj.location_tax && obj.location_tax.some(
        x => filterObject.locations && filterObject.locations.includes(x))) &&
      (!filterObject.roundTypes || obj.roundType && obj.roundType.some(
        x => filterObject.roundTypes && filterObject.roundTypes.includes(x))) &&
      (!filterObject.verticals || obj.vertical_tax && obj.vertical_tax.some(
        x => filterObject.verticals && filterObject.verticals.includes(x)))
    );
   };
   console.log(filterObjects(filterObject, testObject));

【讨论】:

  • 是的,它适用于所有三个属性,例如位置、垂直和圆形类型。还有一个问题,如果其中一个属性没有值 filterObject = { locations: [666,667], roundTypes: [], verticals: [662,661] };
  • 包含或,或者他们需要匹配所有属性?至于没有价值的属性,将需要添加检查以确保属性已定义,或者取决于您希望它的行为方式。如果它为 null 或未定义,您希望它根本不过滤它还是什么?
  • 需要匹配至少一个属性......如何添加该检查,因为得到一个未定义的错误
  • 我已经更新了代码,你会看到我为每个 filterObject 属性添加了一个检查。 testObject的检查我没加,但大同小异
  • 好吧,还有一个问题,如果结果需要有 662 和 663 存在怎么办。基本上所有的属性都需要匹配
【解决方案2】:

如果您只想测试一个条件,只需使用该语句并丢弃其余条件,或者如果您希望任何一个条件为真以获得结果,则将 && 逻辑更改为 ||为必要的陈述。

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

【讨论】:

  • 是的,它适用于所有三个属性,例如位置、垂直和圆形类型。还有一个问题,如果其中一个属性没有值 filterObject = { locations: [666,667], roundTypes: [], verticals: [662,661] };
  • 比较语句将跳过该语句,因为没有可比较的内容,如果缺少值也不会出现任何错误
猜你喜欢
  • 2018-12-14
  • 1970-01-01
  • 2021-09-24
  • 1970-01-01
  • 2014-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-15
相关资源
最近更新 更多