【问题标题】:JQuery: Remove duplicate elements?JQuery:删除重复元素?
【发布时间】:2011-02-18 20:38:34
【问题描述】:

假设我有一个包含重复值的链接列表,如下所示:

<a href="#">Book</a>
<a href="#">Magazine</a>
<a href="#">Book</a>
<a href="#">Book</a>
<a href="#">DVD</a>
<a href="#">DVD</a>
<a href="#">DVD</a>
<a href="#">Book</a>

我将如何使用 JQuery 删除 dups 并留下以下示例:

<a href="#">Book</a>
<a href="#">Magazine</a>
<a href="#">DVD</a>

基本上我正在寻找一种方法来删除找到的任何重复值并显示每个链接的 1 个。

【问题讨论】:

    标签: jquery duplicates


    【解决方案1】:
    var seen = {};
    $('a').each(function() {
        var txt = $(this).text();
        if (seen[txt])
            $(this).remove();
        else
            seen[txt] = true;
    });
    

    说明:

    seen 是一个将任何先前看到的文本映射到true 的对象。它的功能类似于set,包含所有以前看到的文本。 if (seen[txt]) 行检查文本是否在集合中。如果是这样,我们之前已经看过这段文字,所以我们删除了链接。否则,这是我们第一次看到的链接文本。我们将它添加到集合中,以便删除具有相同文本的任何进一步链接。

    表示集合的另一种方法是使用包含所有值的数组。但是,这会使其速度变慢,因为要查看数组中是否有值,我们每次都需要扫描整个数组。相比之下,使用seen[txt] 在对象中查找键非常快。

    【讨论】:

    • Interjay,谢谢你,完美运行。另外,您介意解释一下您的代码以了解它吗?
    • @Keith:添加了解释。我假设你知道 jQuery eachtext 函数的作用,所以没有解释这些。
    • 如果我只想匹配最后一个单词而不是整个文本怎么办?我不喜欢提出新问题,所以我在这里问。在此先感谢:)
    • 简单有效:)
    • 使用这个答案。远离 .unique jQuery 方法,因为它无用且不适用于这种特殊情况。
    【解决方案2】:
    // use an object as map
    var map = {};
    $("a").each(function(){
        var value = $(this).text();
        if (map[value] == null){
            map[value] = true;
        } else {
            $(this).remove();
        }
    });
    

    【讨论】:

      【解决方案3】:

      一种快速简便的方法是

      $("a").​​​​​​​​each(function(){
          if($(this).parent().length)
              $("a:contains('" + $(this).html() + "')").not(this).remove();
      });​
      

      【讨论】:

        【解决方案4】:

        使用jQuery方法$.unique()

        详情见http://api.jquery.com/jQuery.unique/

        【讨论】:

        • 为什么。为什么 包含的 jQuery 方法 有 4 个赞成票,而一堆 8 行的副作用坐在 29 处并被接受?
        • @Inaimathi:可能是因为这个答案不正确。如果两个元素具有相同的文本,$.unique 会将它们都保留下来,因此这并不能满足问题的要求。 $.unique 仅在您有两个对数组中完全相同的 DOM 元素的引用时才有用,这里不是这种情况。
        • 另外,$.unique 只会从数组中删除条目,不会从 DOM 中删除它们。
        • 有一种方法可以使用 $.uniqueSort() 来执行此任务。例如,请参阅link
        • 从 jQuery 3.0 开始,此方法已被弃用,它只是 jQuery.uniqueSort() 的别名。请改用该方法。
        【解决方案5】:

        @interjay @Georg Fritzsche

        你的修复在我的情况下不起作用,所以我构建了一个不同的版本:

        var seen='';
           $('a').each(function(){
                var see=$(this).text();
                if(seen.match(see)){
                    $(this).remove();}
                else{
                    seen=seen+$(this).text();
                }
            });
        

        希望这可以为其他人提供有效的替代简短修复以防万一。

        【讨论】:

        • 我只是偶然发现了这个......@interjay 方法没有任何原因不起作用,另外,这有可能导致误报......如果你有 3 个链接,请尝试一下texts: "a","b" 和 "ab", "ab" 链接将被删除...
        【解决方案6】:

        很好的解决方案的人。 这是我的

        for (i = 0; i < $('li').length; i++) {
          text = $('li').get(i);
          for (j = i + 1; j < $('li').length; j++) {
            text_to_compare = $('li').get(j);
            if (text.innerHTML == text_to_compare.innerHTML) {
              $(text_to_compare).remove();
              j--;
              maxlength = $('li').length;
            }
          }
        }
        

        问候

        【讨论】:

          【解决方案7】:
          $(document).ready(function(){
             $("select").each(function () {
                 var selectedItem = $(this).find('option').filter(':selected').text();
                 var selectedItemValue = $(this).find('option').filter(':selected').val();
                 $(this).children("option").each(function(x){
                     if(this.text == selectedItem && $(this).val() != selectedItemValue) {
                         $(this).remove();
                      }
                  });
              }); 
          });
          

          【讨论】:

          • 对不起,我给出了主意,但上面的代码将保留所选项目并删除所选项目的重复项。
          【解决方案8】:
          $('.photo').each(function (index) { 
              if (index > 0) { 
                  $(this).remove(); 
              } 
          });
          

          【讨论】:

          • 这将删除除第一本“书”之外的所有链接。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-07-05
          • 2013-12-02
          • 1970-01-01
          • 2013-07-18
          • 2021-11-25
          • 1970-01-01
          • 2011-03-22
          相关资源
          最近更新 更多