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

如何将带optgroup分组的JSON数据正确加载到Select2下拉组件

代码存在的3个核心错误
  • 遍历逻辑完全错误:后端返回的数组本身已经符合Select2分组数据格式,你在processResults里多余的$.map+for...in遍历反而破坏了原有结构:遍历数组时拿到的key是数字索引不是分组名,遍历分组对象时会把text、children属性都当成子项处理,最终生成的结构完全不符合Select2要求。
  • AJAX参数传递错误:Select2传入data函数的是配置对象,不是搜索关键词本身,直接把整个对象传给后端会导致后端拿不到用户输入的搜索词。
  • 缺少必要的空选项:开启allowClear和placeholder时,必须给<select>标签预置一个值为空的<option>,否则占位符不显示、清除功能失效。
修正后的完整实现

HTML部分

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/js/select2.min.js" integrity="sha512-2ImtlRlf2VVmiGZsjm9bEyhjGW4dU7B6TNwh/hx/iSByxNENtj3WVE6o/9Lj4TJeVXPi4bnOIMXFIJJAeufa0A==" crossorigin="anonymous" referrerpolicy="no-referrer"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/select2/4.0.13/css/select2.min.css" integrity="sha512-nMNlpuaDPrqlEls3IX/Q56H36qvBASwb3ipuo3MxeWbsQB1881ox0cRv7UPTgBlriqoynt35KjEwgGUeUXIPnw==" crossorigin="anonymous" referrerpolicy="no-referrer" />

<select id="selectForm">
  <!-- 必须添加空option,否则placeholder和allowClear功能异常 -->
  <option></option>
</select>

JS部分

$("#selectForm").select2({
    width: '30%',
    allowClear: true,
    placeholder: "Select Form",
    ajax: {
        url: '@Url.Action("GetOptionList")',
        delay: 250,
        dataType: "json",
        type: "POST",
        // 修正搜索参数传递逻辑
        data: function (params) {
            return {
                 term: params.term
            };
        },
        processResults: function (data) {
            // 后端返回结构已符合Select2分组要求,直接返回即可,无需额外转换
            return {
                results: data
            };
        }   
    }
});
补充说明

你给出的返回数据示例本身就是Select2官方支持的分组格式:顶层数组每一项对应一个选项组,text字段是组名,children数组是组下的选项列表,每个选项包含id和text字段即可被正确渲染,不需要额外做遍历映射。之前多余的转换逻辑是导致功能异常的核心原因。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 17:27:34