Фильтрация данных на основе объекта со значениями фильтра - PullRequest
1 голос
/ 18 апреля 2019

У меня в приложении несколько фильтров.Всякий раз, когда я нажимаю кнопку поиска, данные должны быть отфильтрованы на основе значений поиска.Я не знаю, есть ли лучший способ сделать то, что я пытаюсь сделать более прохладным или причудливым способом.Значения поиска сохраняются следующим образом:

FORM_VALUES =
   {
     title: '',
     name: 'John',
     Age: 56
    }

Если значения объектов пусты '', то я не должен их учитывать при фильтрации массива объектов.Мой массив объектов выглядит следующим образом:

[
 {
   title:'CEO',
   name: 'John',
   Age: 56
 },
 {
   title: null,
   name: 'George',
   Age: 56
 },
]

В этом примере он должен вернуть первый элемент массива.

Мой код:

data.filter(d => {
     if ((d.title === FORM_VALUES.title || FORM_VALUES.title === '')
        && (d.name === FORM_VALUES.name || FORM_VALUES.name === '')
        && (d.age === FORM_VALUES.age || FORM_VALUES.age === '')) {
           return d;
      }
 });

Ответы [ 2 ]

0 голосов
/ 18 апреля 2019

Используйте filter, чтобы получить людей со значениями, и используйте Object.keys и delete, чтобы удалить все пустые записи, и every с Object.entries, чтобы найти фактические объекты:

const FORM_VALUES = {
  title: '',
  name: 'John',
  Age: 56
}

const data = [{
    title: 'CEO',
    name: 'John',
    Age: 56
  },
  {
    title: null,
    name: 'George',
    Age: 56
  }
];

let searchObj = { ...FORM_VALUES };
Object.keys(searchObj).forEach(key => searchObj[key] == "" ? delete searchObj[key] : key);

const found = data.filter(d => Object.entries(searchObj).every(([k, v]) => d[k] == v));
console.log(found);
0 голосов
/ 18 апреля 2019

Получить массив пар ключ / значение из объекта FORM_VALUES с помощью Object.entries().Повторяйте массив пар с Array.every() для каждой пары, возвращайте true, если значение '' (пустая строка) или значение фильтра совпадает со значением текущего объекта.

const FORM_VALUES = {"title":"","name":"John","Age":56}

const data = [{"title":"CEO","name":"John","Age":56},{"title":null,"name":"George","Age":56}]

const result = data.filter(o =>
  Object.entries(FORM_VALUES)
    .every(([k, v]) => v === '' || o[k] === v)
)

console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...