lodash过滤器有多个选项?

时间:2019-04-04 15:57:16

标签: javascript lodash

我已经检查了other answers,但它指的是范围。

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'] });

预期的结果将是Barney,因为Avding既不存在36岁也不是40岁。

2 个答案:

答案 0 :(得分:2)

您可以声明自己的过滤器功能。

_.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 :(得分:1)

如果不使用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);