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

如何去除Select2下拉多选框中的重复选项?

解决Select2多选下拉框重复选项且去重代码导致插件失效的问题

嘿,我来帮你搞定这个问题!你现在遇到的是用Select2实现多选下拉框时出现重复选项,自己写的去重代码又导致Select2失效的情况,下面给你两种实用的解决思路:

一、优先推荐:后端从源头去重(最优解)

既然下拉框的选项是从模型绑定来的,那我们直接在后端就把重复的选项去掉,这样前端就不用额外处理,也不会影响Select2的初始化。

你可以在视图里修改循环逻辑,用LINQ的Distinct()方法对Name去重:

<div class="col-lg-3 col-sm-6">
    <div class="form-group">
        <select name="WhoAmIs" id="WhoAmIs" ng-model="data.WhoAmIs" class="form-control whoAmIDuplicates" multiple>
            @foreach (var whoamiall in Model.WhoAmI)
            {
                // 先提取唯一的Name值
                var uniqueNames = whoamiall.WhoAmIAll.Select(x => x.Name).Distinct();
                foreach (var name in uniqueNames)
                {
                    <option value="@name">@name</option>
                }
            }
        </select>
    </div>
</div>

这样生成的<option>本身就没有重复项,后续直接初始化Select2就完全没问题了,这是最稳妥的方式,避免前端额外处理的风险。

二、前端去重:先处理选项再初始化Select2

如果后端暂时不好修改,那就要调整前端代码的执行顺序——先删除重复的原始选项,再初始化Select2,这样就不会破坏Select2的内部状态了。

你的问题出在之前的代码可能是在Select2初始化之后执行的,这时候Select2已经生成了自己的UI结构,和原始的<select>元素是分离的,修改原始option不会同步到Select2,反而会导致插件失效。

修改后的前端代码:

// 第一步:先处理重复的option
$(".whoAmIDuplicates").each(function() {
    var seenValues = {};
    $(this).find("option").each(function() {
        var optionValue = $(this).val();
        if (seenValues[optionValue]) {
            // 如果已经出现过这个值,删除当前option
            $(this).remove();
        } else {
            // 标记这个值已经出现过
            seenValues[optionValue] = true;
        }
    });
});

// 第二步:再初始化Select2插件
jQuery("#WhoAmIs").select2({ 
    maximumSelectionLength: 3, 
    placeholder: jsResources.BusinessDirectory.SelectGroups+' '+ '('+jsResources.BusinessDirectory.Limit+' '+'3)', 
    allowClear: true 
});

这个逻辑会先遍历原始的<select>元素,把重复值的<option>删掉,然后再让Select2基于去重后的选项初始化,这样插件就能正常工作了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:30:59