фильтр Лодаша с несколькими вариантами? - PullRequest
0 голосов
/ 04 апреля 2019

Я проверил другие ответы на SO, но это относится к диапазонам.

var users = [
   { 'user': 'barney', 'age': 36, 'active': true },
   { 'user': 'fred',   'age': 40, 'active': false },
   { 'user': 'Avding',   'age': 34, 'active': true }
];

_.filter(...)

Я хочу фильтровать по нескольким значениям, поэтому в приведенном выше примере я хотел бысделайте что-то вроде:

_.filter(users, { 'age': [36, 40], 'user': ['barney', 'Avding'] });

Ожидаемым результатом будет просто Барни, поскольку Авдингу не 36 или 40 лет.

Ответы [ 2 ]

2 голосов
/ 04 апреля 2019

Вы можете объявить свою собственную функцию фильтра.

_.filter(users, function (o) {
  return (o.age === 36 || o.age === 40) && (o.user === 'barney' || o.user === 'Avding');
});

Без необходимости создавать отдельное сравнение для каждого возраста или имени:

var ages= [36, 40]
var users = ['barney', 'Avding']
_.filter(users, function (o) {
  return ages.includes(o.age) && users.includes(o.user);
});
1 голос
/ 04 апреля 2019

Не используя lodash, вы можете использовать filter для цикла по массиву.Используйте every, чтобы проверить, все ли параметры проверки.Используйте includes, чтобы проверить, присутствует ли элемент в массиве.

И используйте Object.entries, чтобы преобразовать объект в массив.

var users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"Avding","age":34,"active":true}];
var search = Object.entries({'age': [36, 40],'user': ['barney', 'Avding']});

var result = users.filter(o => search.every(([k, v]) => v.includes(o[k])));

console.log(result);
...