Фильтруйте массив объектов с несколькими элементами по их значениям, используя javascript или lodash - PullRequest
0 голосов
/ 26 апреля 2020

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

const data =
    [
     {id: 1, name: 'Peter',age: 21, gender: 'Male'},
     {id: 2, name: 'Steve',age: 24, gender: 'Male'},
     {id: 3, name: 'John',age: 21, gender: 'Male'},
     {id: 4, name: 'Julie',age: 26, gender: 'Female'}
    ]

Я хочу динамически фильтровать вышеуказанный массив с несколькими элементами по значениям, используя javascript или loda sh. Если я добавлю больше элементов к объекту и попытаюсь отфильтровать их, код должен работать нормально. Я ожидаю передать элементы, которые должны быть отфильтрованы, и соответствующие значения из объекта, как показано ниже.

const filter = {'name':'e','gender':'mal'}

Ожидаемый результат:

[{id: 1, name: 'Peter',age: 21, gender: 'Male'},
         {id: 2, name: 'Steve',age: 24, gender: 'Male'},
         {id: 4, name: 'Julie',age: 26, gender: 'Female'}]

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Используйте Object.entries для отделения ключей и значений от объекта фильтра, найдите значение, используя значение ключа и lowerCase, так как вы не различаете прописные и строчные буквы

const data =
    [
     {id: 1, name: 'Peter',age: 21, gender: 'Male'},
     {id: 2, name: 'Steve',age: 24, gender: 'Male'},
     {id: 3, name: 'John',age: 21, gender: 'Male'},
     {id: 4, name: 'Julie',age: 26, gender: 'Female'}
    ]

const filter = {
  'name': 'e',
  'gender': 'mal'
}


const result = data.filter(x => Object.entries(filter)
  .every(([key, val]) => x[key].toString().toLowerCase().includes(val)))
  
  
console.log(result)
0 голосов
/ 26 апреля 2020

Вы можете выполнить фильтрацию, используя записи и Array#every для использования всех фильтров или Array#some для наличия только одного свойства фильтра объекта.

const
    data = [{ id: 1, name: 'Peter', age: 21, gender: 'Male' }, { id: 2, name: 'Steve', age: 24, gender: 'Male' }, { id: 3, name: 'John', age: 21, gender: 'Male' }, { id: 4, name: 'Julie', age: 26, gender: 'Female' }],
    filter = { name: 'Pe', gender: 'Mal' },
    filters = Object.entries(filter),
    result1 = data.filter(o => filters.every(([k, v]) => o[k].includes(v))),
    result2 = data.filter(o => filters.some(([k, v]) => o[k].includes(v)));

console.log(result1);
console.log(result2);
.as-console-wrapper { max-height: 100% !important; top: 0; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...