Как отфильтровать массив объектов на основе другого массива объектов?

У меня есть два массива объектов, как показано ниже

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"
        }
]

Я хочу отфильтровать массив данных с помощью массива условий, например, если свойство условия в массиве условий содержит Expert, тогда мне нужно отфильтровать массив данных на основе 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"
            }
]

Как мне решить эту проблему?

Всего 2 ответа


Вы можете фильтровать с подмножеством условий без флага 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; } 


Это должно работать для вас:

    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)

Есть идеи?

10000