You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:15:55