web-dev-qa-db-fra.com

JQuery: Supprimer les éléments en double?

Disons que j'ai une liste de liens avec des valeurs en double comme ci-dessous:

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

Comment pourrais-je, en utilisant JQuery, supprimer les doublons et me retrouver avec ce qui suit par exemple:

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

Fondamentalement, je cherche un moyen de supprimer les valeurs en double trouvées et d'afficher 1 de chaque lien.

39
Keith Donegan
var seen = {};
$('a').each(function() {
    var txt = $(this).text();
    if (seen[txt])
        $(this).remove();
    else
        seen[txt] = true;
});

Explication:

seen est un objet qui mappe tout texte précédemment vu sur true. Il fonctionne comme un set contenant tous les textes déjà vus. La ligne if (seen[txt]) vérifie si le texte est dans l'ensemble. Si c'est le cas, nous avons déjà vu ce texte, nous supprimons donc le lien. Sinon, c'est un texte de lien que nous voyons pour la première fois. Nous l'ajoutons à l'ensemble afin que tout autre lien avec le même texte soit supprimé.

Une autre façon de représenter un ensemble consiste à utiliser un tableau contenant toutes les valeurs. Cependant, cela ralentirait considérablement le processus, car pour voir si une valeur se trouve dans le tableau, nous aurions besoin d'analyser le tableau entier à chaque fois. La recherche d'une clé dans un objet à l'aide de seen[txt] Est très rapide en comparaison.

110
interjay

Utiliser la méthode jQuery $ .unique ()

Détails voir sur 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

Votre correctif n'a pas fonctionné dans mon cas, je crée donc une version différente:

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

J'espère que cela fournira à quelqu'un d'autre une solution de remplacement alternative valide au cas où.

1
Ben Muircroft