代码之家  ›  专栏  ›  技术社区  ›  Tienus McVinger

有没有办法限制if条件的需要?

  •  1
  • Tienus McVinger  · 技术社区  · 6 年前

    作为后续行动 this question ,我成功地对我的observable应用了多个过滤器,这取决于用户决定应用哪个过滤器。

    我的“问题”是,不确定是否应用了某个过滤器,甚至所有过滤器的工作方式都不同;有些是数字,有些是字符串。

    我的观察结果如下:

    getProperties(): Observable<Property[]> {
        return this.http.get<Property[]>(this.url);
    }
    

    并应用动态过滤器,如下所示:

    filterAndSort() {
        let count = 0;
        return this.getProperties()
        //Only return properties where price is higher than or equal to min price
        .map(properties => properties.filter((property) => {
            if(property.price >= this.userSettings.getAppSetting("filterMinPrice", "number")) {
                return property;
            }
        })
        .filter((property) => {
            //Return all properties if max price is not set (0)
            if(this.userSettings.getAppSetting("filterMaxPrice", "number") == 0) {
                return property;
            }
            //Only return properties where price is lower than or equal to max price
            else if(property.price <= this.userSettings.getAppSetting("filterMaxPrice", "number")) {
                return property;
            }
        })
        .filter((property) => {
            if(property.incomeCategory == this.userSettings.getAppSetting("filterIncomeClass", "string")) {
                return property;
            } else if (this.userSettings.getAppSetting("filterIncomeClass", "string") == "none") {
                return property;
            }
        })
        .filter((property) => {
            if(property.numberOfRooms >= this.userSettings.getAppSetting("filterMinRooms", "number")) {
                return property;
            }
        })
        .filter((property) => {
            if(property.numberOfBedrooms >= this.userSettings.getAppSetting("filterMinBedrooms", "number")) {
                return property;
            }
        })
        .sort((a: Property, b: Property) => {
            //..
            }
        ))
    }
    

    这是可行的,但我认为这不是我所说的最好的解决方案 filter() 一次又一次我认为如果我设法减少过量的if条件并仅使用 return property; 一旦在这种条件下,我的代码将更加整洁。(请记住,我将来会添加更多的过滤器选项,因此如果我必须以类似的方式应用它们,这肯定会变得更加混乱:p)

    有什么建议吗?

    (只是想澄清一下:我在这里使用NativeScript/Angular/Typescript)。

    1 回复  |  直到 6 年前
        1
  •  2
  •   shaunhusain    6 年前

    这可能会起作用,我不确定这是否可以被视为一种改进,但只是试图将逻辑的结果浓缩到一个过滤函数中:

    .filter(property => {
          if(
            (
              this.userSettings.getAppSetting("filterMaxPrice", "number") == 0 ||
              property.price <= this.userSettings.getAppSetting("filterMaxPrice", "number")
            ) &&
            (
              property.incomeCategory == this.userSettings.getAppSetting("filterIncomeClass", "string") ||
              this.userSettings.getAppSetting("filterIncomeClass", "string") == "none"
            ) &&
            (
              property.numberOfRooms >= this.userSettings.getAppSetting("filterMinRooms", "number")
            ) &&
            (
              property.numberOfBedrooms >= this.userSettings.getAppSetting("filterMinBedrooms", "number")
            )
          ) {
              return property;
          }
      })