JQuery:删除重复的元素?

Kei*_*gan 40 jquery duplicates

假设我有一个重复值的链接列表如下:

<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>
Run Code Online (Sandbox Code Playgroud)

我将如何使用JQuery删除重复项,并留下以下内容,例如:

<a href="#">Book</a>
<a href="#">Magazine</a>
<a href="#">DVD</a>
Run Code Online (Sandbox Code Playgroud)

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

int*_*jay 111

var seen = {};
$('a').each(function() {
    var txt = $(this).text();
    if (seen[txt])
        $(this).remove();
    else
        seen[txt] = true;
});
Run Code Online (Sandbox Code Playgroud)

说明:

seen是一个将任何以前看到的文本映射到的对象true.它作为一个包含所有以前看到的文本的集合.该行if (seen[txt])检查文本是否在集合中.如果是这样,我们之前已经看过这个文本,所以我们删除了链接.否则,这是我们第一次看到的链接文本.我们将其添加到集合中,以便删除具有相同文本的任何其他链接.

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

  • @Keith:补充说明.我假设你知道jQuery [`each`](http://api.jquery.com/each/)和[`text`](http://api.jquery.com/text/)函数是做什么的,所以没解释那些. (2认同)

小智 11

使用jQuery方法$ .unique()

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

  • @Inaimathi:也许是因为这个答案不正确.如果两个元素具有相同的文本,`$ .unique`将同时留下它们,所以这不会问问题.`$ .unique`仅在数组中对相同的DOM元素有两个引用时才有用,这不是这里的情况. (21认同)
  • 为什么.为什么*包含的jQuery方法*有4个upvotes而8行副作用位于29并被接受? (7认同)
  • 另外,`$ .unique`只会删除数组中的条目,它不会从DOM中删除它们. (5认同)

coo*_*alu 6

// use an object as map
var map = {};
$("a").each(function(){
    var value = $(this).text();
    if (map[value] == null){
        map[value] = true;
    } else {
        $(this).remove();
    }
});
Run Code Online (Sandbox Code Playgroud)