如何基于标签键数组筛选嵌套标签结构的文章数组?
嘿,这问题不难,我来给你捋清楚怎么实现!
首先,你的需求是从posts数组里筛选出包含指定标签(也就是keys数组里的key对应的标签)的文章对吧?核心思路就是用filter配合数组的遍历方法来检查每篇文章的标签是否匹配,另外为了性能优化,咱们可以先把keys转成Set来加快查找速度。
直接上可行的代码方案:
const posts = [{note: 'something..', title: 'something..', tags: [{title: 'First tag', key: '123'}, {title: 'Second tag', key: 'ABC'}]}, {note: 'another post..', title: 'another post..', tags: [{title: 'third tag', key: '098'}, {title: 'forth tag', key: 'ZYX'}, {title: 'fifth tag', key: '1A9'}]}]; const keys = ['123', 'ABC', '098', 'ZYX', '1A9']; // 把keys转成Set,提升查找效率(尤其是keys数组很大的时候) const keySet = new Set(keys); // 筛选:只要文章有一个标签的key在keySet里,就保留这篇文章 const filteredPosts = posts.filter(post => { return post.tags.some(tag => keySet.has(tag.key)); }); console.log(filteredPosts);
代码解释:
- Set优化:
Set的has()方法是O(1)时间复杂度,比数组的includes()(O(n))快得多,当你的标签数量很多时,这个优化能明显提升性能。 - filter方法:遍历所有文章,只保留回调返回
true的文章。 - some方法:检查当前文章的标签数组中,是否存在至少一个标签的key在目标keySet里——只要找到匹配项就立刻返回
true,不用遍历完所有标签,效率拉满。
如果你的需求是只保留所有标签都在keys数组里的文章(也就是文章的每个标签key都能在keys里找到),那只需要把some()换成every()就行:
const filteredPosts = posts.filter(post => { return post.tags.every(tag => keySet.has(tag.key)); });
这两种方案都能完美解决你的问题,根据实际需求选就行~
内容的提问来源于stack exchange,提问作者Barry B
相关产品推荐
相关产品推荐

