如何在内部条件过滤器中使用过滤器?

时间:2018-11-19 14:20:32

标签: javascript

我尝试在`过滤器中应用条件链。如何将先前条件中的结果加入并传递下一个结果:

this.fltRooms = this.rooms.filter(room => {
      let _rule;
      if (formValues["auditoryNumber"]) {
        _rule = formValues["auditoryNumber"] == room.title;
      }

      if (formValues["floor"]) {
        _rule = formValues["floor"] == room.floor; // Should be AND
      }

      if (formValues["corpus"]) {
        _rule = formValues["corpus"] == room.building; // Should be AND
      }

      return _rule;
    });

因此,逻辑是,如果存在formValues["auditoryNumber"]formValues["floor"]formValues["corpus"],则按所有三个条件进行过滤,且介于AND之间。

5 个答案:

答案 0 :(得分:3)

如果都不存在怎么办?

正如您所描述的,它应该非常简单。像

this.fltRooms = this.rooms.filter(room =>
    formValues["auditoryNumber"] == room.title
    && formValues["floor"] == room.floor
    && formValues["corpus"] == room.building);

答案 1 :(得分:2)

替代@bipll正确答案,使用定义的键数组进行比较

this.filtRooms = this.rooms.filter(x => [
    'auditoryNumber',
    'floor',
    'corpus',
 ].every(y => x[y] === formValues[y]));

如果要比较的两个对象上的键不同

this.filtRooms = this.rooms.filter(x => [
    [
      'auditoryNumber',
      'title',
    ],
    [
      'floor',
      'floor',
    ],
    [
      'corpus',
      'building',
    ],
  ].every(([
    key1,
    key2,
  ]) => x[key1] === void 0 || x[key1] === formValues[key2]));

答案 2 :(得分:2)

基本上,您想说是否未设置过滤器为真。如果设置了过滤器,则检查值是否匹配。

this.fltRooms = this.rooms.filter(room => 
  (!formValues["auditoryNumber"] || formValues["auditoryNumber"] == room.title) &&
  (!formValues["floor"] || formValues["floor"] == room.floor) &&
  (!formValues["corpus"] || formValues["corpus"] == room.building)
)

使用ifs的其他方法是在每张支票中使用布尔值

this.fltRooms = this.rooms.filter(room => {
  let _rule = true
  if (formValues["auditoryNumber"]) {
    _rule = formValues["auditoryNumber"] == room.title;
  }

  if (_rule && formValues["floor"]) {
    _rule = formValues["floor"] == room.floor; // Should be AND
  }

  if (_rule && formValues["corpus"]) {
    _rule = formValues["corpus"] == room.building; // Should be AND
  }

  return _rule;
});

答案 3 :(得分:0)

this.filterRooms = this.rooms.filter(meetsSearchParams);

    function meetsSearchParams(room){
      return  room.auditoryNumber == formValues["auditoryNumber"] &&
              room.floor == formValues["floor"] &&
              room.corpus == formValues["corpus"];
    }

为了尽可能使内容可读。

答案 4 :(得分:0)

如果您需要扩展它,请在两个结构之间建立一个映射数组

var fields = [
  {f: "auditoryNumber", p: "title"},
  {f: "floor", p: "floor"},
  {f: "corpus", p: "building"}
];

this.fltRooms = this.rooms.filter(room => 
  fields.every(field => !formValues[field.f] || formValues[field.f] == room[field.p]);
)