次のように重複した値を持つリンクのリストがあるとします:
<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つを表示する方法を探しています。
_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]
_を使用してオブジェクトのキーを検索するのは、比較すると非常に高速です。
JQueryメソッドを使用する $ .unique()
詳細は http://api.jquery.com/jQuery.unique/ をご覧ください
// use an object as map
var map = {};
$("a").each(function(){
var value = $(this).text();
if (map[value] == null){
map[value] = true;
} else {
$(this).remove();
}
});
$(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();
}
});
});
});
@interjay @Georg Fritzsche
私の場合、修正は機能しなかったため、別のバージョンを作成します。
var seen='';
$('a').each(function(){
var see=$(this).text();
if(seen.match(see)){
$(this).remove();}
else{
seen=seen+$(this).text();
}
});
念のために、これが有効な代替ショートフィックスを他の誰かに提供することを願っています。