web-dev-qa-db-ja.com

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を使用して、DUPを削除し、たとえば次のようにするにはどうすればよいでしょうか。

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

基本的に、見つかった重複値を削除し、各リンクの1つを表示する方法を探しています。

39
Keith Donegan
_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]_を使用してオブジェクトのキーを検索するのは、比較すると非常に高速です。

110
interjay

JQueryメソッドを使用する $ .unique()

詳細は http://api.jquery.com/jQuery.unique/ をご覧ください

11
Vladimir
// 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
coolnalu
$(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
Saleh

@interjay @Georg Fritzsche

私の場合、修正は機能しなかったため、別のバージョンを作成します。

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

念のために、これが有効な代替ショートフィックスを他の誰かに提供することを願っています。

1
Ben Muircroft