【问题标题】:Angular - Manipulate filter condition dynamicallyAngular - 动态操作过滤条件
【发布时间】:2019-05-28 01:04:49
【问题描述】:

我有 3 个数组。

    var severityFilters = ["High", "Medium", "Low"]

 var ruleFilters = ["true", "false"] 

var allResults = [

{
    "name": "Test1",
    "severity": "High",
    "clean": true
},

{
    "name": "Test2",
    "severity": "Low",
    "clean": false
},

{
    "name": "Test3",
    "severity": "Medium",
    "clean": false
},

{
    "name": "Test4",
    "severity": "High",
    "clean": true
}

]

severityFilters 数组和ruleFilters 是在用户选中和取消选中某些过滤器复选框时动态创建的。因此,如果没有选中 severityFilters 复选框,则该数组将为空。如果只检查了High,那么severityFilters 将包含High。与ruleFilters 复选框相同。

我想根据severityFiltersruleFilters 中的值编写一个函数来返回一些过滤结果。 filterResults 函数在选中每个过滤器复选框时被调用。

var filteredResults = []

    filterResults (severityFilters, ruleFilters, allResults)
    {
       for (let i = 0; i < allResults.length; i++) {
            if (severityFilters.length > 0 && ruleFilters.length > 0)
            {
              if (ruleFilters.includes(this.allResults[i].clean.toString()) && 
severityFilters.includes(allResults[i].severity)
              )
              {
                this.filteredResults = [...this.filteredResults, ...allResults[i]];
              }
            }
    }
    } 

考虑到severityFiltersruleFilters 都已指定,此函数有效。

如何检查以下场景的过滤:

  1. ruleFilters 可能为空
  2. severityFilters 可能为空。
  3. 定义了一个或多个severityFilters,但不存在ruleFilters,反之亦然。

如果不写冗长的 if 条件,有没有办法调整函数,以便过滤结果,无论 severityFiltersruleFilters 数组的长度如何。

【问题讨论】:

    标签: javascript angular


    【解决方案1】:

    您可以先检查 filter 数组的 length,然后再检查它们是否包含属性值。如果severityFilters 为空,!severityFilters.length 将返回 true。因此,由于||,它不会检查第二个includes 条件。如果severityFilters 确实有一些值,那么severityFilters.includes(o.severity) 将被检查,只有severityFilters 中具有severity 值的对象将被过滤

    const severityFilters = ["High"]
    const ruleFilters = ["true", "false"]
    var allResults=[{name:"Test1",severity:"High",clean:true},{name:"Test2",severity:"Low",clean:false},{name:"Test3",severity:"Medium",clean:false},{name:"Test4",severity:"High",clean:true}];
    
    const output = allResults.filter(o =>
      (!severityFilters.length || severityFilters.includes(o.severity)) &&
      (!ruleFilters.length || ruleFilters.includes(o.clean.toString()))
    )
    
    console.log(output)

    【讨论】:

    • hmm.. 我不能真正改变 allResults 数组,就像你定义的那样。
    • @Jake 我这里没有修改allResults
    • 你有clean:!0。只能是falsetrue
    • @Jake 哦,对不起。我使用缩小器将数组放在一行中。它出于某种奇怪的原因将 false 转换为 !0
    猜你喜欢
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-20
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    相关资源
    最近更新 更多