如何利用Lodash的_filter方法通过集合A过滤集合B?
使用Lodash过滤集合B,保留id存在于集合A中的元素
没问题,这是个很常见的集合处理场景,用Lodash可以轻松搞定。我给你分享几种实用的方案,你可以根据数据规模和具体需求来选:
方案1:基础版(适合中小规模集合)
先提取集合A的所有id,再用_.filter遍历集合B,筛选出id在A中的元素:
// 示例数据 const collectionA = [ { id: 1, desc: '元素A1' }, { id: 3, desc: '元素A3' } ]; const collectionB = [ { id: 1, name: '元素B1' }, { id: 2, name: '元素B2' }, { id: 3, name: '元素B3' }, { id: 4, name: '元素B4' } ]; // 提取集合A的id数组 const aIds = _.map(collectionA, 'id'); // 过滤集合B const filteredB = _.filter(collectionB, item => _.includes(aIds, item.id)); // 结果: [{ id: 1, name: '元素B1' }, { id: 3, name: '元素B3' }]
解释:
_.map(collectionA, 'id'):快速提取集合A中所有对象的id属性,得到一个id数组。_.filter:遍历集合B的每个元素,用_.includes检查当前元素的id是否存在于A的id数组中,符合条件的会被保留。
方案2:高性能版(适合大规模集合)
如果你的集合数据量很大,用Set来存储A的id会让查找效率从O(n)提升到O(1),性能更好:
const aIdSet = new Set(_.map(collectionA, 'id')); const filteredB = _.filter(collectionB, item => aIdSet.has(item.id));
解释:
Set是ES6原生的数据结构,它的has方法查找元素的速度远快于数组的_.includes,数据量越大,性能优势越明显。
方案3:用Lodash的_.keyBy实现
你也可以用_.keyBy把集合A转换成以id为键的对象,再通过_.has判断id是否存在:
const aIdMap = _.keyBy(collectionA, 'id'); const filteredB = _.filter(collectionB, item => _.has(aIdMap, item.id));
解释:
_.keyBy(collectionA, 'id')会生成一个形如{1: {id:1, ...}, 3: {id:3, ...}}的对象,然后_.has可以快速检查某个id是否是这个对象的键。
这些方案都能完美解决你的问题,核心思路都是先把集合A的id提取出来做成便于快速查找的结构,再过滤集合B。如果你的对象结构有特殊情况(比如id是嵌套属性,比如item.user.id),只需要调整_.map或者判断条件里的路径就好,比如改成_.map(collectionA, 'user.id')就行。
内容的提问来源于stack exchange,提问作者Andre Kirchhoff
相关产品推荐
相关产品推荐

