如何使用Lodash的filter方法实现单个key匹配多个值的筛选需求
Lodash实现单字段多值匹配筛选的方案
_.matches默认执行的是全等匹配,你传入{ 'age': [36, 40] }时,它会判断对象的age属性是否严格等于[36,40]这个数组,自然无法得到预期结果,你可以用以下几种方式实现需求:
方案1:直接在filter回调中结合_.includes判断
这是最简洁的实现方式,适合临时需求:
const result = _.filter(users, item => _.includes([36, 40], item.age));
如果需要同时叠加其他匹配条件,比如还要匹配active: true,可以组合使用_.matches和判断逻辑:
const result = _.filter(users, item => { return _.matches({active: true})(item) && _.includes([36,40], item.age); });
方案2:封装通用的增强匹配函数
如果你希望保留类似{age: [36,40]}这种传参语法,可以自己封装一个工具函数,自动识别数组值做多值匹配:
function multiMatch(conditions) { return function(item) { return _.every(conditions, (condVal, key) => { // 如果条件值是数组,做多值包含匹配 if (_.isArray(condVal)) { return _.includes(condVal, item[key]); } // 非数组值走默认的全等匹配 return _.isEqual(item[key], condVal); }) } } // 调用方式和你预期的完全一致 const result = _.filter(users, multiMatch({ 'age': [36, 40] }));
你也可以在这个函数里扩展更多匹配规则,比如支持正则匹配、范围匹配等。
方案3:使用_.overSome组合多个匹配条件
如果可选值不多,也可以用_.overSome组合多个_.matches条件:
const result = _.filter(users, _.overSome([ _.matches({age: 36}), _.matches({age: 40}) ]));
三种方案都可以实现你要的筛选效果,其中方案2的调用方式最贴合你写的预期语法。
内容的提问来源于stack exchange,提问作者Fahad Sohail
相关产品推荐
相关产品推荐

