如何使用Lodash迭代器简写语法实现多值匹配的数组过滤
用Lodash实现多年龄值过滤的正确姿势
嘿,你遇到的这个问题其实是对Lodash迭代器简写的适用场景理解有点偏差——Lodash的_.filter里那种[key, value]的数组简写,只能用来匹配单个精确值,所以你试的两种写法都达不到预期:
["age", 36 || 40]里的36 || 40会被JavaScript先计算成36,本质还是在找age等于36的用户,当然只能拿到barney["age", [36, 40]]则是在找age属性**严格等于数组[36,40]**的对象,你的用户数组里根本没有这样的数据,所以返回空数组很正常
不过要实现和({ age }) => age === 36 || age === 40完全一样的过滤效果,还是有几种优雅的Lodash风格写法的:
方法1:用_.overSome组合多个单值匹配器
这是最贴合Lodash迭代器风格的写法,把多个单属性匹配逻辑组合成“或”的关系:
import * as _ from "lodash"; var users = [ { user: "barney", age: 36, active: true }, { user: "fred", age: 40, active: false } ]; const result = _.filter(users, _.overSome([ ['age', 36], // 这里可以直接用你熟悉的数组简写 ['age', 40] ])); console.info("result: ", result); // => 输出包含barney和fred的数组
这里_.overSome会依次执行数组里的每个匹配器,只要有一个返回true,就会保留当前元素,完美实现“age是36或者40”的逻辑。
方法2:用_.includes做值存在性判断
如果你的目标值是一个集合,用_.includes来判断属性值是否在集合里会更简洁:
const result = _.filter(users, user => _.includes([36, 40], user.age)); // 或者写成更“Lodash链式”的风格: const result = _.filter(users, _.flow( _.property('age'), // 提取age属性值 _.partial(_.includes, [36, 40]) // 绑定目标数组,判断是否包含 ));
总结
Lodash的数组简写语法确实不支持直接写多值“或”的逻辑,必须借助逻辑组合函数(比如_.overSome)或者值存在性判断(比如_.includes)来实现你要的效果。上面两种方法都能达成和你箭头函数完全一致的过滤结果~
内容的提问来源于stack exchange,提问作者Remi
相关产品推荐
相关产品推荐

