Vanilla JavaScript:按数组过滤嵌套数组,匹配所有分类ID
解决帖子分类多条件同时匹配的过滤问题
刚好碰到过类似的逻辑误区,我来帮你捋清楚问题出在哪以及怎么解决~
你之前的问题核心是搞反了.every的判断对象:
- 用
.some的时候,你是判断帖子的分类里只要有一个在过滤数组里就保留,这会拿到满足任一条件的帖子,不符合需求; - 直接把
.some换成.every后,你是要求帖子的所有分类ID都必须在过滤数组里,但你的需求是帖子必须包含过滤数组里的所有ID(帖子可以有其他额外分类),这完全是两个逻辑,所以才会返回空结果。
修正后的代码实现
const posts_array = [ { id: 1, categories: [ { category_id: 1, category_name: "one" }, { category_id: 2, category_name: "two" } ] }, { id: 2, categories: [ { category_id: 1, category_name: "one" }, { category_id: 3, category_name: "three" } ] }, { id: 3, categories: [ { category_id: 1, category_name: "one" }, { category_id: 4, category_name: "four" }, { category_id: 5, category_name: "five" } ] } ]; const category_id_array = [1, 4]; function filterPostsByCategoryIds(category_id_array){ const custom_filter = post => { // 先把当前帖子的所有分类ID提取成一个简单数组,方便后续判断 const postCategoryIds = post.categories.map(category => category.category_id); // 关键:检查过滤数组里的每一个ID,都能在当前帖子的分类ID中找到 return category_id_array.every(targetId => postCategoryIds.includes(targetId)); }; return posts_array.filter(custom_filter); } // 测试验证 console.log(filterPostsByCategoryIds(category_id_array)); // 输出结果:[{ id: 3, categories: [...] }],完全符合你的需求
逻辑拆解
- 提取分类ID数组:对每个帖子,用
.map把嵌套的categories数组转换成只包含category_id的简单数组,比如帖子3会变成[1,4,5],这样后续判断更高效直观; - 反向验证全匹配:对需要过滤的
category_id_array使用.every,确保数组里的每一个目标ID(这里是1和4)都存在于当前帖子的分类ID数组中。只有当所有目标ID都匹配时,这个帖子才会被filter保留下来。
这样就精准实现了你要的“同时包含所有指定分类ID”的过滤逻辑,不会再出现之前的错误结果啦~
内容的提问来源于stack exchange,提问作者Tokant
相关产品推荐
相关产品推荐

