2010-05-12 106 views
36

说我有与重复值的链接列表如下:JQuery:删除重复的元素?

<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,删除复本,并会留下例如以下:

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

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

回答

102
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]在对象中查找关键字的速度非常快。

+1

Interjay,我感谢你,完美的作品。 另外,你会介意解释你的代码以理解它吗? – 2010-05-12 21:48:13

+2

@Keith:添加了解释。我假设你知道jQuery ['each'](http://api.jquery.com/each/)和['text'](http://api.jquery.com/text/)函数是做什么的,所以没有解释这些。 – interjay 2010-05-12 22:00:10

+0

真棒,这对我来说完全是直接工作的 – jsims281 2010-06-13 22:11:32

3
// use an object as map 
var map = {}; 
$("a").each(function(){ 
    var value = $(this).text(); 
    if (map[value] == null){ 
     map[value] = true; 
    } else { 
     $(this).remove(); 
    } 
}); 
-1

一个快速简便的方法是

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

使用jQuery方法$ .unique()

细节上http://api.jquery.com/jQuery.unique/

+6

为什么。为什么*包含的jQuery方法*有4个upvotes,而8行的副作用是坐在29并被接受? – Inaimathi 2012-10-14 15:32:10

+18

@Inaimathi:也许是因为这个答案不正确。如果两个元素具有相同的文本,'$ .unique'会将它们都留下,所以这不会做问题的提问。 '$ .unique'只有在数组中有两个对同一个DOM元素的引用时才有用,在这里不是这种情况。 – interjay 2012-11-13 17:38:09

+4

此外,'$ .unique'只会从数组中移除条目,它不会从DOM中移除它们。 – interjay 2012-11-13 17:51:30

1

@interjay @Georg Fritzsche也

您的个人资料

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

希望在提供他人使用的有效替代短期修复,以防万一:所以我建立一个不同版本的X并没有我的情况下工作。

+1

我只是偶然发现了......没有理由为什么@interjay方法不工作,再加上,这有可能导致误报......如果您与这些文本有3个链接,请尝试:“a”,“ b“和”ab“,”ab“链接将被删除... – Salketer 2014-11-06 09:06:43

-1

不错的解决方案的人。 这里是我的

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; 
    } 
    } 
} 

问候

1
$(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(); 
      } 
     }); 
    }); 
}); 
+1

请解释它是如何解决问题的。 – 2014-02-19 12:42:26

+0

上午,我jst给了主意,但上面的一段代码将保留选定的项目并删除所选项目的重复。 – Saleh 2014-10-09 08:32:48

-2
$('.photo').each(function (index) { 
    if (index > 0) { 
     $(this).remove(); 
    } 
}); 
+3

这会除去第一个“书”之外的所有链接。 – Ben 2015-05-11 15:51:13