2010-10-01 19 views
10
<ul id="myid"> 
<li>microsoft</li> 
<li>microsoft</li> 
<li>apple</li> 
<li>apple</li> 
</ul> 

Quiero eliminar los duplicados de li mediante el uso de jQuery.jQuery eliminar duplicados li

¿Cómo puedo hacer eso?

+0

¿Están siempre uno al lado del otro, ordenó esto? –

Respuesta

7

example Me parece que el guión es más rápido

var liText = '', liList = $('#myid li'), listForRemove = []; 

$(liList).each(function() { 

    var text = $(this).text(); 

    if (liText.indexOf('|'+ text + '|') == -1) 
    liText += '|'+ text + '|'; 
    else 
    listForRemove.push($(this)); 

})​; 

$(listForRemove).each(function() { $(this).remove(); }); 
+0

Gracias andres descalzo, ¿Cómo podemos hacerlo con datos "EN VIVO"? – dave

+0

podría dar un ejemplo con lo que hace u otra pregunta con el problema? –

7
uniqueLi = {}; 

$("#myid li").each(function() { 
    var thisVal = $(this).text(); 

    if (!(thisVal in uniqueLi)) { 
    uniqueLi[thisVal] = ""; 
    } else { 
    $(this).remove(); 
    } 
}) 

Esta acumulación un índice (un objeto) de valores únicos. Por su ejemplo, uniqueLi se verá así después:

{ 
    "microsoft": "", 
    "apple": "" 
} 

Así que cada vez que se encuentra un valor que se ha añadido al índice antes, el <li> asociado consigue quitado.

5

Usted podría utilizar

var inner = []; 
$('li').each(function(index, Element){ 
    if (jQuery.inArray(this.innerHTML, inner) == -1){ 
     inner.push(this.innerHTML); 
    } 
    else { 
     $(this).remove(); 
    } 
}); 
+0

'jQuery.inArray()' es un poco ineficiente en comparación con el operador 'in' para objetos. – Tomalak

3

Aquí hay una función que hará que, de una manera ligeramente diferente:

function removeDuplicateItems(id) { 
    var ul = $('#' + id); 

    $('li', ul).each(function() { 
     if($('li:contains("' + $(this).text() + '")', ul).length > 1) 
      $(this).remove(); 
    }); 
} 

llamada con removeDuplicateItems('myid');

+0

Esto fallará cuando el texto del elemento contenga una comilla simple. ;-) – Tomalak

+0

Puedo ver por qué dices eso, pero en realidad no es así -algo (ya sea el selector 'contains' o la función' .text() ', no puedo entender cuál de la fuente de jQuery) escapa automáticamente de las comillas. Eche un vistazo: http://jsfiddle.net/kXurk/ –

+0

Hola Mark, gracias por el código. pero ¿cómo podemos hacerlo "en vivo"? – dave

0

He utilizado la solución @Thariama en el pasado, pero tengo problemas de compatibilidad con IE6 (todavía necesito para este dinosaurio).

Si el artículo se repite, elimínelo de ul. Funciona con li agregado dinámico.

  var seen = {}; 
      $("ul#emails_exclusion_list").find("li").each(function(index, html_obj) { 
       txt = $(this).text().toLowerCase(); 

       if(seen[txt]) { 
        $(this).remove(); 
       } else { 
        seen[txt] = true; 
       } 
      });