JS Сложная фильтрация массива

Не могу придумать как отфильтровать такой массив, используя JS:

var users = [
  {
    Severity: 'Warning',
    Status: 'Unresolved',
  },
  {
    Severity: 'Warning',
    Status: 'Resolved',
  },
  {
    Severity: 'Critical',
    Status: 'Unresolved',
  },
  {
    Severity: 'Critical',
    Status: 'Resolved',
  },
];

И если фильтр такой:

var filter = [
  {
    key: 'Severity',
    values: ['Warning', 'Critical']
  },
  {
    key: 'Status',
    values: ['Resolved']
  },
];

Я хочу получить результат:

var users = [
  {
    Severity: 'Critical',
    Status: 'Resolved',
  },
  {
    Severity: 'Warning',
    Status: 'Resolved',
  },
];

Спасибо!


Ответы (1 шт):

Автор решения: Sergey Glazirin

Проходим циклом по элементам фильтра, и фильтруем каждый раз по нужному полю с нужным значением, вроде не сложно.

function filterData(data, filter) {
  let result = data;
  filter.forEach(item => {
    result = result.filter(element =>
      item.values.includes(element[item.key])
    )
  })

  return result;
}

var users = [{
    Severity: 'Warning',
    Status: 'Unresolved',
  },
  {
    Severity: 'Warning',
    Status: 'Resolved',
  },
  {
    Severity: 'Critical',
    Status: 'Unresolved',
  },
  {
    Severity: 'Critical',
    Status: 'Resolved',
  },
];

var filterKey = [{
    key: 'Severity',
    values: ['Warning', 'Critical']
  },
  {
    key: 'Status',
    values: ['Resolved']
  },
];



console.log(filterData(users, filterKey))

→ Ссылка