【问题标题】:lodash filter with multiple options?具有多个选项的 lodash 过滤器?
【发布时间】:2019-04-04 15:57:15
【问题描述】:

我在 SO 上检查了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 岁。

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    您可以声明自己的过滤器函数。

    _.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);
    });
    

    【讨论】:

    • 请看原始问题,我不需要检查范围。
    • 我编辑了答案。这个概念是您可以在自定义函数中声明您需要的任何比较
    • 是否有更好的方法来进行比较,似乎是检查可能相当大的年龄数组的冗长方法。
    • @panthro return [36, 40].includes(o.age) && ['barney', 'Avding'].includes(o.user)
    • 再次编辑答案更通用。但我的意思是,一旦你知道你可以使用一个函数来定义你自己的行为,那么如何实现你想要的行为应该很简单
    【解决方案2】:

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

    【讨论】:

    • 乐于使用 lodash。
    • 没问题。只是另一种选择:)
    猜你喜欢
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2014-11-26
    • 1970-01-01
    相关资源
    最近更新 更多