使用Lodash过滤数组时如何传入数组形式的过滤条件且避免循环
无显式循环的Lodash实现方案
注:你之前尝试的for循环版本存在逻辑硬伤——每次循环都从原始
menus数组重新执行过滤,上一次的过滤结果会被直接覆盖,最终仅能排除传参数组里最后一个匹配的title,无法实现同时排除所有目标菜单的效果。
以下是两种依托Lodash内置能力实现、无需手写循环的可行方案:
基于判断规则组合的灵活实现
核心思路是把“菜单title在排除名单内”的判断逻辑封装成规则,直接传给_.filter完成过滤,全程没有手写循环:getFileterMenus = (menus, filterMenu) => { // 生成「判断值是否不在排除名单」的规则方法 const isNotInFilterList = _.negate(_.partial(_.includes, filterMenu)) return _.filter(menus, menu => isNotInFilterList(menu.title)) }各方法的作用:
_.partial:提前把传入的排除名单filterMenu固定为_.includes的第一个参数,生成一个“判断某个值是否在排除名单内”的方法_.negate:把上述方法的返回值取反,变成“判断某个值不在排除名单内”的规则- 最终把规则作为
_.filter的判断条件,就能一次性过滤掉所有title在排除名单里的菜单
基于数组差集能力的语义化实现
Lodash提供的_.differenceBy专门用于按指定字段计算两个数组的差集,刚好适配当前过滤场景,代码逻辑更直观:getFileterMenus = (menus, filterMenu) => { // 构造待排除的菜单结构集合 const excludedItems = filterMenu.map(title => ({ title })) // 按title字段取差集,得到所有不在排除集合里的原菜单 return _.differenceBy(menus, excludedItems, 'title') }这种方式不需要手动写判断规则,直接利用Lodash内置的差集能力完成匹配,不会出现循环覆盖结果的问题。
内容的提问来源于stack exchange,提问作者ganesh kaspate
相关产品推荐
相关产品推荐

