JavaScript新手求助:基于JSON数组的高级搜索实现方案
搞定多按钮筛选高级搜索的实用思路(给JS新手)
嘿,作为JS新手能啃下学校项目里的高级搜索功能,已经超厉害啦!我来给你分享几个接地气的实现思路,代码都是新手友好型的,一步步来👇
核心思路梳理
我们要做的就是:记录用户勾选的筛选条件 → 遍历JSON数组找出符合条件的对象 → 把结果渲染到页面
具体代码实现(附注释)
首先假设你的JSON数组结构大概是这样(你可以换成自己的实际结构):
// 已经解析好的JSON数组示例 const jsonArray = [ { id: 1, name: 'JavaScript入门', category: 'book', price: 79, isInStock: true }, { id: 2, name: '无线耳机', category: 'electronics', price: 299, isInStock: false }, { id: 3, name: 'Python实战', category: 'book', price: 99, isInStock: true }, // ... 剩下12个对象 ];
第一步:记录用户的筛选选择
给每个筛选按钮(建议用<input type="checkbox">)加事件监听,把选中的条件存在一个对象里:
// 用来存储当前激活的筛选条件 const activeFilters = {}; // 获取所有筛选按钮(假设按钮有类名.filter-btn,并且带data-key和data-value属性,比如data-key="category" data-value="book") const filterButtons = document.querySelectorAll('.filter-btn'); filterButtons.forEach(btn => { btn.addEventListener('change', function() { const filterKey = this.dataset.key; // 对应JSON对象的键,比如"category" const filterValue = this.dataset.value; // 对应要筛选的值,比如"book" if (this.checked) { // 如果是同个筛选维度多选(比如同时选"book"和"electronics"),用数组存 if (!activeFilters[filterKey]) { activeFilters[filterKey] = []; } activeFilters[filterKey].push(filterValue); } else { // 取消勾选时移除对应值 if (activeFilters[filterKey]) { activeFilters[filterKey] = activeFilters[filterKey].filter(val => val !== filterValue); // 如果这个维度没有选中项了,就删掉这个键 if (activeFilters[filterKey].length === 0) { delete activeFilters[filterKey]; } } } // 每次条件变化都重新筛选并渲染结果 filterAndRenderResults(); }); });
第二步:筛选符合条件的结果
写一个筛选函数,遍历数组检查每个对象是否满足所有选中的条件:
function filterAndRenderResults() { // 没有筛选条件时直接显示全部 if (Object.keys(activeFilters).length === 0) { renderResults(jsonArray); return; } // 筛选逻辑:只保留满足所有激活条件的对象 const filteredItems = jsonArray.filter(item => { // 遍历每个筛选条件 for (const key in activeFilters) { const allowedValues = activeFilters[key]; // 注意:如果你的JSON值是数字/布尔类型,要转成字符串和data-value匹配 const itemValue = item[key].toString(); // 如果当前对象的这个键值不在允许的列表里,就排除它 if (!allowedValues.includes(itemValue)) { return false; } } // 所有条件都满足,留下这个对象 return true; }); // 把筛选后的结果渲染到页面 renderResults(filteredItems); }
第三步:渲染结果到页面
写一个简单的渲染函数,根据你的页面结构调整即可:
function renderResults(results) { const resultsContainer = document.getElementById('results-container'); // 先清空容器 resultsContainer.innerHTML = ''; if (results.length === 0) { resultsContainer.innerHTML = '<p>抱歉,没有找到符合条件的结果😔</p>'; return; } // 遍历结果,生成DOM元素 results.forEach(item => { const resultCard = document.createElement('div'); resultCard.className = 'result-card'; resultCard.innerHTML = ` <h4>${item.name}</h4> <p>分类:${item.category}</p> <p>价格:¥${item.price}</p> <p>库存:${item.isInStock ? '有货' : '缺货'}</p> `; resultsContainer.appendChild(resultCard); }); } // 页面加载完成后先显示全部结果 document.addEventListener('DOMContentLoaded', filterAndRenderResults);
新手友好的拓展提示
- 如果需要范围筛选(比如价格区间):可以给按钮加
data-min和data-max属性,然后在筛选函数里判断item.price >= min && item.price <= max - 如果需要**“或”条件**(满足任一选中按钮即可):把筛选逻辑里的
for...in循环改成用some方法,只要有一个条件满足就返回true - 记得给按钮加合适的label,方便用户点击,比如:
<label> <input type="checkbox" class="filter-btn" data-key="category" data-value="book"> 图书 </label>
慢慢来,你已经在正确的方向上啦!如果有具体的细节问题(比如特定的筛选逻辑、页面结构),随时调整就行~
内容的提问来源于stack exchange,提问作者Kjetil
相关产品推荐
相关产品推荐

