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

我想通過使用jquery從li刪除重複項。jquery刪除重複的li

我該怎麼做?

+0

它們總是彼此相鄰,命令行這個? – 2010-10-01 12:01:49

回答

7

example 我發現劇本快

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

感謝andres descalzo,我們如何使用「LIVE」數據做到這一點? – dave 2010-10-05 04:25:34

+0

你能舉一個例子來說明你做了什麼,或者是另一個問題? – 2010-10-05 12:37:16

7
uniqueLi = {}; 

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

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

這建立了唯一值的索引(一個對象)。對於你的榜樣,uniqueLi看起來像這樣算賬:

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

所以每當一個值遇到之前已經添加到索引,相關<li>被刪除。

5

你可以使用

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

與對象的'in'運算符相比''jQuery.inArray()'有點低效。 – Tomalak 2010-10-01 14:22:55

3

這裏是一個會做,方式略有不同的功能:

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

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

呼叫與removeDuplicateItems('myid');

+0

當項目文本包含單引號時,這將失敗。 ;-) – Tomalak 2010-10-01 14:24:17

+0

我可以看到你爲什麼這麼說,但實際上它不是某種東西(無論是'contains'選擇器還是'.text()'函數,我都搞不清楚哪個來自jQuery源代碼)自動轉義引號。看看:http://jsfiddle.net/kXurk/ – 2010-10-01 16:06:40

+0

嗨馬克,感謝您的代碼。但我們怎樣才能做到「現場」? – dave 2010-10-05 04:52:57

0

我過去曾使用@Thariama解決方案,但我與IE6有兼容性問題(我仍然需要支持這個恐龍)。

如果項目重複,請將其從ul中移除。它適用於動態添加的li。

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