求助:如何用Lodash _.filter实现动态多条件数组过滤?
问题分析
你遇到的问题其实是对 Lodash _.filter 的参数用法理解有偏差啦。_.filter 的第二个参数如果是对象,是用来匹配被筛选元素的所有键值对的——也就是说它会要求目标元素完全包含这个对象的所有属性和对应值。但你传入的是一个对象数组 conditionArr,这时候 _.filter 根本没法识别这个数组形式的条件,自然就返回空数组了。
你的解决方案解析
你找到的 _.map + _.find 的方法完全可行,我们来拆解下逻辑:
- 遍历
conditionArr里的每个条件对象con - 用
_.find在users数组里精准定位到user属性匹配的完整用户对象 - 通过扩展运算符
...把条件对象和找到的用户对象合并,最终得到你想要的结果
代码示例:
var users = [{ user: 'barney', age: 36, active: true }, { user: 'fred', age: 40, active: false }, { user: 'travis', age: 37, active: true } ]; var conditionArr = [{ user: 'barney' }, { user: 'fred' }]; result = _.map(conditionArr, (con) => ({ ...con, ...(_.find(users, { user: con.user })) })); // 输出结果: [{ user: 'barney', age: 36, active: true }, { user: 'fred', age: 40, active: false } ]
补充一个更高效的实现思路
如果你的用户数据量比较大,可以先把 users 转换成以 user 为键的映射对象,这样查找效率会更高:
// 先把用户数组转成 { barney: {...}, fred: {...} } 的结构 const userMap = _.keyBy(users, 'user'); // 遍历条件数组直接从映射里取对应对象合并 result = _.map(conditionArr, con => ({ ...con, ...userMap[con.user] }));
这种方式避免了多次遍历 users 数组,性能会更优哦。
内容的提问来源于stack exchange,提问作者ycjcl868
相关产品推荐
相关产品推荐

