如何根据标签数组过滤JavaScript嵌套数组?
问题描述
我有一个可供用户筛选的profileList数组,筛选规则作用于其嵌套的tags数组。用户可创建标签白名单taglist,为每个profile的tags数组添加一个或多个标签;同时用户可通过向filterArray中添加一个或多个标签来筛选profileList数组。
需求是:检查filterArray中的至少一个标签是否存在于profileList各元素的tags嵌套数组中。
现有代码无法实现该需求,因为当前filter函数逻辑错误,无法匹配预期筛选规则。现有代码如下:
//待筛选的数组 let profileList = [ {name: "John", tags: ["green", "yellow", "red"]}, {name: "Alex", tags: ["yellow", "white", "purple"]}, {name: "Jane", tags: ["green", "pink", "blue"]} ] //用户自定义:最多可添加30个标签 let taglist = ["green", "yellow", "red", "black"...] //用户自定义:可添加任意数量标签用于筛选 let filterArray = ["green", "red"] const filteredProfiles = store.state.profileList.filter(element => { return filterArray.includes(element.tags); });
示例:若用户将"yellow"和"red"加入filterArray,应返回John和Alex的条目。
解决方案
要实现“filterArray中至少一个标签存在于profile的tags数组”的筛选逻辑,需要修改filter回调函数,利用filterArray.some()方法检查是否有任意一个标签匹配当前profile的tags数组。
正确代码如下:
const filteredProfiles = profileList.filter(element => { // 检查filterArray中是否至少有一个标签存在于当前元素的tags数组里 return filterArray.some(tag => element.tags.includes(tag)); });
逻辑说明
filterArray.some()会遍历filterArray中的每个标签,只要有一个标签满足element.tags.includes(tag)(即该标签在当前profile的tags数组中存在),就返回true,当前profile会被保留在筛选结果中。- 原代码的错误在于:
filterArray.includes(element.tags)是判断整个tags数组是否作为元素存在于filterArray中,而filterArray存储的是单个标签字符串,完全不符合需求逻辑。
示例验证
当filterArray = ["yellow", "red"]时:
- John的tags数组包含"yellow"和"red",满足条件,被保留;
- Alex的tags数组包含"yellow",满足条件,被保留;
- Jane的tags数组不包含"yellow"或"red",被过滤掉。
最终筛选结果为John和Alex的条目,符合预期。
内容的提问来源于stack exchange,提问作者jeff3546
相关产品推荐
相关产品推荐

