JavaScript基于includes的搜索/过滤算法开发遇阻求助
实现学位筛选/搜索算法的思路和代码示例
嘿,我来帮你搞定这个过滤逻辑!其实核心就是用数组的filter()方法,把用户选的条件和每个学位的属性逐一比对,留下符合条件的项就行。我给你拆解步骤,再附上代码示例:
第一步:明确数据结构
首先咱们得先假设你的学位数组大概长这样(如果实际结构不一样,你可以对应调整字段名):
// 示例学位数组 const degreeList = [ { name: "计算机科学硕士", dept: "计算机学院", filters: ["全日制", "学术型", "有奖学金"] }, { name: "软件工程学士", dept: "计算机学院", filters: ["全日制", "应用型"] }, { name: "应用数学硕士", dept: "理学院", filters: ["非全日制", "学术型"] } ];
第二步:获取筛选条件并实现过滤逻辑
你的filterSearch()函数可以这么写,分两种常见的匹配场景(你可以根据需求选):
场景1:多选条件需全部匹配(学位必须包含用户选的所有筛选项)
function filterSearch() { // 获取用户选择的条件 const selectedDept = getDept(); // 比如返回"计算机学院"或空字符串 const selectedFilters = getSearchValue(); // 比如返回["全日制", "学术型"]或空数组 // 开始过滤学位数组 const filteredDegrees = degreeList.filter(degree => { // 处理院系筛选:如果用户没选院系,或者院系匹配就通过 const deptMatch = !selectedDept || degree.dept === selectedDept; // 处理多选筛选:如果用户没选任何项,或者学位的filters包含所有选中项 const filtersMatch = !selectedFilters.length || selectedFilters.every(filter => degree.filters.includes(filter)); // 只有两个条件都满足才保留这个学位 return deptMatch && filtersMatch; }); // 最后返回过滤后的结果,或者用来更新页面展示 return filteredDegrees; }
场景2:多选条件需至少匹配一个(学位只要包含用户选的任意一个筛选项即可)
如果你的需求是只要学位满足任意一个多选条件,就把every改成some:
const filtersMatch = !selectedFilters.length || selectedFilters.some(filter => degree.filters.includes(filter));
第三步:边界情况处理
- 如果用户什么都没选,
filter()会返回整个学位数组,符合预期 - 如果
getDept()返回null或undefined,记得在判断时处理成“无筛选”的情况(比如!selectedDept会自动把这些假值当成“没选”) - 如果你的多选条件返回的是单个字符串(而非数组),记得先转成数组再处理,比如
const selectedFilters = Array.isArray(getSearchValue()) ? getSearchValue() : [getSearchValue()]
这样整个逻辑就通顺啦,你可以根据自己实际的学位数组结构和筛选需求调整字段名和匹配规则~
内容的提问来源于stack exchange,提问作者racinne
相关产品推荐
相关产品推荐

