【问题标题】:Remove Duplicate Dropdown Options with Sharing 2 Values删除共享 2 个值的重复下拉选项
【发布时间】:2017-01-06 17:51:08
【问题描述】:

有很多 javascript 和 jQuery 允许您根据值删除重复的选择选项,但我需要基于 2 个值。目前,我的下拉菜单会生成一个选项列表,格式如下:

<option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>

我有脚本可以让我查看manufacturer_chevy 并删除重复的内容,但我需要删除任何带有value="manufacturer_chevy"data-value="Manufacturer_Chevy" 的重复选项。

基于 1 个值的一对:

$(".tag-base option").each(function() {
$(this).siblings("[value='"+ this.value+"']").remove();
});

还有……

var found = [];
$(".tag-base option").each(function() {
if($.inArray(this.value, found) != -1) $(this).remove();
found.push(this.value);
});

有什么想法吗?提前致谢

【问题讨论】:

  • @Copper_Thompson,考虑性能方面

标签: javascript jquery


【解决方案1】:

尝试像这样使用Multiple Attribute Selector

$(".tag-base option").each(function() {
    var $t = $(this);
    $t.siblings("[value='"+ $t.val() +"'][data-id='" + $t.data("id") + "']").remove();
});

这将从您的下拉列表中查找并删除重复项。在这种情况下,重复项被定义为“与另一个共享相同值和数据 ID 的选项。”

编辑:根据您的评论,您希望匹配值和数据-id,而不是数据-。我已经编辑了我的代码以反映这一点。

【讨论】:

  • 这是有效的,但仍会全部删除。我可能打错字了。看例子,,它不是data-value,实际上是data-id,因为可能有卡车,货车,汽车等。现在进行测试,看起来从 value 更改为 id 会起作用。感谢您的帮助!
  • 很好,没问题。正如您所提到的,我已将答案编辑为使用 data-id
  • 我们修改了什么来只隐藏元素?我将 .remove() 编辑为 .hide(),结果完全不同
  • 您无法隐藏&lt;option&gt; 元素。将display: none; 放在&lt;option&gt; 上没有任何作用。 Example here.
【解决方案2】:

要选择具有对应于指定值的 data-value 属性的所有选项,您可以使用filter

代码:

$(".tag-base option").each(function(i, ele) {
  var val = ele.value;
  var eleToRemove = $(ele).siblings("[value='" + val + "']").filter(function(i, e) {
    var dVal = $(e).data('value');
    return dVal.toLowerCase() == val.toLocaleString();
  }).remove();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>


<select class="tag-base">
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
</select>

【讨论】:

    【解决方案3】:

    JavaScript 使用Document.querySelectorAll()Node.getAttribute()Node.removeChild() 方法的解决方案:

    纯 Javascript 方法比 JQuery 的 $(el).siblings(...) 方法快 10 倍以上!

    var attr_counts = {};
        
    document.querySelectorAll('#truckList option').forEach(function(n){
        var hash = n.getAttribute('data-value') + n.getAttribute('value');
        (typeof this[hash] === 'undefined')? this[hash] = 1 : this[hash]++;
        if (this[hash] > 1) {
            n.parentNode.removeChild(n);
        }
    }, attr_counts);
    <select id='truckList'>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_Honda" value="manufacturer_honda">Honda</option>
    <option data-id="truck" data-value="Manufacturer_Other" value="manufacturer_other">Other</option>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_GMC" value="manufacturer_gmc">GMC</option>
    <option data-id="truck" data-value="Manufacturer_Chevy" value="manufacturer_chevy">Chevy</option>
    <option data-id="truck" data-value="Manufacturer_GMC" value="manufacturer_gmc">GMC</option>
    <option data-id="truck" data-value="Manufacturer_Honda" value="manufacturer_honda">Honda</option>
    </select>

    https://jsfiddle.net/t7cnt1xx/2/

    【讨论】:

    • 这种方法依赖于你提供重复的值,不是吗?从 OP 的示例 sn-ps 中,我相信 Manufacturer_chevy 是一个示例,它应该删除所有重复项,而无需事先指定它们。
    • @Santi,注意,OP 说 但我需要删除任何重复的 value="manufacturer_chevy" & data-value="Manufacturer_Chevy" 选项。跨度>
    • “注意”...?你是个真正的魅力者,不是吗。您提供的上下文可以很容易地解释为他的示例的扩展。他作为“工作代码”提供的两个 sn-ps 都删除了 所有 重复项,而不是特定的。
    • @Santi,OP 会决定的,不要打扰。如果他要求“杀死”所有重复项 - 我会这样做,但不是当你要求时
    • 我应该指定的,都是重复的,因为可能有多个
    猜你喜欢
    • 2015-10-13
    • 1970-01-01
    • 2012-03-11
    • 1970-01-01
    • 2017-11-06
    • 2015-11-21
    • 2019-01-02
    • 1970-01-01
    • 2020-08-04
    相关资源
    最近更新 更多