2010-05-12 9 views
36

Dire que j'ai une liste de liens avec des valeurs en double comme ci-dessous:JQuery: Supprimer les éléments en double?

<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 puis-je, en utilisant JQuery, retirez les dups et être laissé comme suit par exemple:

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

Fondamentalement, je Je cherche un moyen d'enlever toutes les valeurs en double trouvées et montrer 1 de chaque lien.

Répondre

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

Explication:

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

Une autre façon de représenter un ensemble consiste à utiliser un tableau contenant toutes les valeurs. Cependant, cela rendrait la procédure beaucoup plus lente puisque pour voir si une valeur est dans le tableau, nous aurions besoin d'analyser le tableau entier à chaque fois. Regarder une clé dans un objet en utilisant seen[txt] est très rapide en comparaison.

+1

Interjay, je te remercie, fonctionne parfaitement. En outre, cela vous dérangerait-il d'expliquer votre code pour le comprendre? –

+2

@Keith: Ajout d'une explication. Je suppose que vous savez ce que font les fonctions jQuery ['each'] (http://api.jquery.com/each/) et [' text'] (http://api.jquery.com/text/), donc n'a pas expliqué ceux-ci. – interjay

+0

Génial, cela a fonctionné parfaitement tout de suite pour moi aussi – jsims281

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

Un moyen rapide et facile serait

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

Utilisez la méthode jQuery .unique $()

Détail Voir http://api.jquery.com/jQuery.unique/

+6

Pourquoi. Pourquoi * la méthode jQuery incluse * a 4 upvotes alors qu'une pile de 8 lignes d'effets secondaires est assise à 29 et acceptée? – Inaimathi

+18

@Inaimathi: Peut-être parce que cette réponse est incorrecte. Si deux éléments ont le même texte, '$ .unique' les laissera tous les deux, donc cela ne fait pas ce que la question demande. '$ .unique' n'est utile que si vous avez deux références au même élément DOM dans un tableau, ce qui n'est pas le cas ici. – interjay

+4

En outre, '$ .unique' ne supprimera que les entrées d'un tableau, il ne les supprimera pas du DOM. – interjay

1

@interjay @Georg Fritzsche

Votre fi x ne fonctionne pas dans mon cas si je construis une autre version:

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

Espoirs cette offre quelqu'un d'autre avec une solution à court alternative valable au cas où.

+1

Je suis tombé sur ceci ... Il n'y a aucune raison pour que la méthode @interjay ne fonctionne pas, en plus, cela peut causer des faux positifs ... Essayez-le si vous avez 3 liens avec ces textes: "a", " b "et" ab ", le lien" ab "sera supprimé ... – Salketer

-1

Gentilles personnes de solution. Voici le mien est

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

Salutations

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

S'il vous plaît expliquer comment il résout le problème. –

+0

suis sry, j'ai jst donné idée, mais ci-dessus morceau de code conservera l'élément sélectionné et supprime les doublons de l'élément sélectionné. – Saleh

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

Cela supprimerait tous les liens en plus du premier 'Livre'. – Ben