【问题标题】:How to filter an array of objects based on another array of objects?如何根据另一个对象数组过滤一个对象数组?
【发布时间】:2019-09-30 08:06:49
【问题描述】:

我有两个对象数组,如下所示

conditions= [
          {
            'condition': 'Expert',
            'value': 'All'
          },
          {
            'condition': 'Coach',
            'value': 'willaim'
          },
          {
            'condition': 'manager',
            'value': 'Brandy Lovings'
          },
          {
            'condition': 'site',
            'value': 'ALL'
          },
          {
            'condition': 'client',
            'value': 'ALL'
          }
        ]

data=[
{
          "Date": "11/6/2018",
          "client": "Verizon",
          "Expert": "Ellison, Lauren",
          "Coach": "willaim",
          "manager": "Brandy Lovings",
          "site": "Sundance",
          "Metric": "STR"
        },
{
          "Date": "11/6/2018",
          "client": "Amzaon",
          "Expert": "Ellison, Lauren",
          "Coach": "Dash Williamson",
          "manager": "David",
          "site": "abc",
          "Metric": "STR"
        }
]

我想用条件数组过滤数据数组,比如如果条件数组中的条件属性包含专家,那么我需要根据data.Expert = conditions[Expert Conditionindex].value过滤数据数组然后我需要返回所有符合这个条件的数据。

另一件事是,如果 value: 'ALL' 则无需在该特定条件下进行过滤。

想要的输出是这样的

filteredData = [
{
              "Date": "11/6/2018",
              "client": "Verizon",
              "Expert": "Ellison, Lauren",
              "Coach": "willaim",
              "manager": "Brandy Lovings",
              "site": "Sundance",
              "Metric": "STR"
            }
]

我该如何解决这个问题?

【问题讨论】:

    标签: javascript arrays reactjs object filter


    【解决方案1】:

    您可以使用不带ALL 标志的条件子集进行过滤。

    var conditions = [{ condition: "Expert", value: "All" }, { condition: "Coach", value: "willaim" }, { condition: "manager", value: "Brandy Lovings" }, { condition: "site", value: "ALL" }, { condition: "client", value: "ALL" }],
        data = [{ Date: "11/6/2018", client: "Verizon", Expert: "Ellison, Lauren", Coach: "willaim", manager: "Brandy Lovings", site: "Sundance", Metric: "STR" }, { Date: "11/6/2018", client: "Amzaon", Expert: "Ellison, Lauren", Coach: "Dash Williamson", manager: "David", site: "abc", Metric: "STR" }],
        filters = conditions.filter(({ value }) => value.toUpperCase() !== 'ALL'),
        result = data.filter(o =>
            filters.every(({ condition, value }) => o[condition] === value));
        
    console.log(result);
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案2】:

      这应该适合你:

          const conditionsObj={}
      
          conditions.filter(({value})=>value.toLowerCase()!=='all').forEach((condition)=>{
                conditionsObj[condition.condition]=condition.value
              })
      
      
      
           const results=data.filter((item)=>{
                    let match=false;  
                   Object.keys(conditionsObj).forEach((_key)=>{
                      if(conditionsObj[_key]===item[_key]){
                        match=true;
                      }
                    })
                    return match;
                  })
      
      console.log(results)
      

      【讨论】:

        猜你喜欢
        • 2021-10-24
        • 2022-11-30
        • 2020-08-15
        • 2021-05-14
        • 2019-09-15
        • 2019-04-05
        • 2020-01-27
        • 1970-01-01
        • 2018-10-03
        相关资源
        最近更新 更多