Как динамически фильтровать с javascript? - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу построить фильтр, который в зависимости от того, сколько правил, он фильтрует массив объектов на основе этих правил.

У меня есть массив таких объектов:

const myList = [
{name: 'Joe',
 sex: 'male',
 isStared: false,
},
{name: 'Ann',
 sex: 'female',
 isStared: true,
},
{name: 'Gil',
 sex: 'female',
 isStared: true,
},
] 

У меня также есть объект с правилами для fillter, который задает пользователь, например, это может быть:

const rules = {sex: 'male', isStared: 'false'}

Я не хочу жестко его кодировать, чтобы он специально проверяет sex === 'male' или isStared === true

Но я хочу, чтобы, если правил было больше, он проверял их и возвращал только те, которые, например, являются мужскими и смотрятся.

У меня сейчас жестко закодированная фильтрация, но если правила изменятся, она сломается:

myList.filter(friend => friend.sex === action.filterQuery.sex && friend.sex.isStared === action.filterQuery.sex)

Есть идеи, как этого добиться?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 09 апреля 2020

Вы можете использовать filter, Object.entries и every -

const myList = [
{name: 'Joe',
 sex: 'male',
 isStared: false,
},
{name: 'Ann',
 sex: 'female',
 isStared: true,
},
{name: 'Gil',
 sex: 'female',
 isStared: true,
},
] 

const rules = {sex: 'male', isStared: false}  // !

const result =
  myList.filter(item =>
    Object.entries(rules).every(([ k, v ]) =>
      item[k] === v
    )
  )

console.log(result)
// [
//   {
//     "name": "Joe",
//     "sex": "male",
//     "isStared": false
//   }
// ]

!: И следите, 'false' - это не то же самое, что false. Не заключайте логические выражения в кавычки.

0 голосов
/ 09 апреля 2020
const filter_with_ruleset = ruleset => input_arr => input_arr.filter(
  item => Object.entries(ruleset)
    .reduce((accum, curr) => accum && item[curr[0]] === curr[1], true)
);

// Usage
const ruleset_1 = { sex: 'male', isStared: true };
const filter_starred_males = filter_with_ruleset(ruleset_1);

console.log(filter_starred_males(myList));

НО это фильтрует только по равенству, а не по "name.starts_with" или чему-то еще.

Также просто следите, ваши исходные данные имеют орфографическую ошибку, похоже, isStared должно быть isStarred, но пока вы последовательны, с вами все будет в порядке.

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