如何根据选中的标签数组筛选从GitHub API获取的项目数据
原代码问题说明
- 你用
map遍历标签返回的是布尔数组,filter只要收到非假值就会保留项目,布尔数组永远为真,所以会返回全部数据。 includes的调用主体搞反了,你是要判断当前标签是否在选中数组selected里,应该是selected.includes(topic)而不是反过来。
正确实现
分两种常用的筛选场景:
场景1:只要项目包含任意一个选中标签就返回(最常用的标签筛选逻辑)
const filteredData = userData.filter(item => item.topics.some(topic => selected.includes(topic)) );
这里用到Array.some()方法,只要当前项目的topics里有一个标签存在于selected数组中,就会返回true保留该项目。
场景2:项目必须包含所有选中标签才返回
如果你的筛选逻辑是要求同时命中所有选中的标签,就换成Array.every()方法:
const filteredData = userData.filter(item => selected.every(topic => item.topics.includes(topic)) );
性能优化方案
如果项目数据量较大、或者选中标签数量多,可以把selected数组转成Set实例,查找效率更高:
const selectedSet = new Set(selected); const filteredData = userData.filter(item => item.topics.some(topic => selectedSet.has(topic)) );
内容的提问来源于stack exchange,提问作者Cristian Müller
相关产品推荐
相关产品推荐

