使用Lodash匹配ID筛选含嵌套tags的interactions对象
解决方法:匹配包含指定ID标签的Interactions对象
我明白你的问题啦——你之前的代码没法工作是因为meta.tags是一个数组,keyBy('meta.tags.id')没办法把数组里的id作为键来分组,所以后续的at(ids)自然找不到匹配的项。我们需要换一种思路,直接筛选出符合条件的interactions对象。
高效的解决方案(用Set优化查找)
首先,把你的ids数组转换成Set,这样可以大幅提升ID的查找效率(尤其是当ids数量较多时):
const idSet = new Set(ids);
然后用Lodash的filter结合some方法来筛选符合条件的对象:
const matches = _.filter(interactions, (item) => { // 检查当前对象的tags数组中是否存在任意一个ID在idSet里 return _.some(item.meta.tags, (tag) => idSet.has(tag.id)); });
如果你喜欢链式调用的写法,也可以这样写:
const matches = _(interactions) .filter((item) => _.some(item.meta.tags, (tag) => idSet.has(tag.id))) .value();
原理说明
_.filter:遍历interactions数组,只保留满足条件的对象_.some:检查当前对象的meta.tags数组中,是否至少有一个标签的ID存在于我们的目标ID集合中Set的has方法:时间复杂度为O(1),比数组的includes(O(n))更高效,适合处理大量ID的场景
简化版(不用Set)
如果你的ids数组很小,也可以直接用数组的includes方法,写法更简洁:
const matches = _.filter(interactions, (item) => { return _.some(item.meta.tags, (tag) => ids.includes(tag.id)); });
这样就能正确找出所有meta.tags.id与ids中任意ID匹配的interactions对象啦!
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

