2010-05-12 4 views
36

Скажем, у меня есть список ссылок с повторяющимися значениями, как показано ниже:JQuery: удалить дубликаты элементов?

<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, удалите Dups и оставить следующим, например:

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

В основном я Я ищу способ удалить все найденные повторяющиеся значения и показать 1 из каждой ссылки.

ответ

102
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] очень быстр в сравнении.

+1

Interjay, я благодарю тебя, отлично работает. Кроме того, не могли бы вы объяснить свой код, чтобы понять его? –

+2

@ Keith: Добавлено объяснение. Я предположил, что вы знаете, что делают функции jQuery ['each'] (http://api.jquery.com/each/) и [' text'] (http://api.jquery.com/text/), поэтому не объяснили это. – interjay

+0

Удивительный, это отлично сработало для меня, а также – 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

быстрый и простой способ будет

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

Использование JQuery $ .unique()

Детали увидеть на http://api.jquery.com/jQuery.unique/

+6

Почему. Почему * включенный метод jQuery * имеет 4 upvotes, в то время как 8-строчная куча побочных эффектов сидит на 29 и принимается? – Inaimathi

+18

@ Inaimathi: Может быть, потому что этот ответ неверен. Если два элемента имеют один и тот же текст, '$ .unique' оставит их обоих, так что это не делает то, что задает вопрос. '$ .unique' полезен, если у вас есть две ссылки на один и тот же точный элемент DOM в массиве, что здесь не так. – interjay

+4

Кроме того, '$ .unique' будет удалять только записи из массива, он не удалит их из DOM. – interjay

1

@interjay @Georg Фрич

Ваш fi х не работает в моем случае, так что я построить другую версию:

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

надеется, что это дает кому-то еще с действительной альтернативой коротким исправить только в том случае.

+1

Я просто наткнулся на это ... Нет причин, по которым метод @interjay не работает, плюс, это может вызвать ложное срабатывание ... Попробуйте, если у вас есть 3 ссылки с этими текстами: «a», b "и" ab ", ссылка" ab "будет удалена ... – Salketer

-1

Nice люди решения. Вот это мое

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

Приветствия

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

Пожалуйста, объясните, как она решает проблему. –

+0

am sry, i jst дал идею, но над куском кода сохранит выбранный элемент и удалит дубликаты выбранного элемента. – Saleh

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

Это приведет к удалению каждой ссылки, кроме первой «Книги». – Ben

Смежные вопросы