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

jQuery如何通过表单序列化数据匹配多data属性筛选优惠列表

核心实现思路
  • 先把表单序列化得到的数组转为筛选映射表:只保留用户勾选的选项,key为表单控件的name,value为选中值(复选框默认值是on,也可以自己设value属性匹配data属性的不同值)
  • 遍历每个优惠项时,只要所有勾选的筛选条件都和对应data属性值匹配,就保留该优惠项,否则隐藏
  • 无需修改筛选函数即可扩展新筛选维度:新增表单控件只要name和优惠项的data-xxx属性名保持一致即可自动适配
完整实现代码

JavaScript

$(function(){
  $('form').submit(function(e){
    e.preventDefault();
    var formData = $(this).serializeArray();
    filterOffers(formData);
  });
});

function filterOffers(attributes){
  // 转换为易使用的筛选条件对象
  const filterMap = {};
  attributes.forEach(item => {
    // 可根据业务需要调整值的类型转换规则,比如处理数字、字符串枚举值等
    filterMap[item.name] = item.value === 'on' ? true : item.value;
  });

  $(".offer").hide().filter(function() {
    const offerData = $(this).data();
    // 所有筛选条件全部匹配才保留当前优惠项
    for(const [key, requiredVal] of Object.entries(filterMap)) {
      if(offerData[key] !== requiredVal) {
        return false;
      }
    }
    return true;
  }).show();
}

HTML 扩展示例

新增筛选维度不需要修改JS逻辑,直接添加对应name的表单控件和data属性即可:

<form>
  <input type="checkbox" name="monthly" value="true" /> 月度付费
  <input type="checkbox" name="unlimited" value="true" /> 无限流量
  <!-- 新增校园专属筛选维度 -->
  <input type="checkbox" name="campus" value="true" /> 校园专属
  <input type="submit" />
</form>

<div class="offer" data-monthly="true" data-unlimited="false" data-campus="false">Offer 1</div>
<div class="offer" data-monthly="true" data-unlimited="true" data-campus="false">Offer 2</div>
<div class="offer" data-monthly="true" data-unlimited="true" data-campus="true">Offer 3</div>
逻辑验证

同时勾选「月度付费」和「无限流量」时,会匹配到Offer2、Offer3展示;如果额外勾选「校园专属」,则只有Offer3展示,符合业务预期。

内容的提问来源于stack exchange,提问作者devjs11

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 23:39:01