You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 07:23:56