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, удаляю дубликаты и остаюсь со следующим, например:
<a href="#">Book</a>
<a href="#">Magazine</a>
<a href="#">DVD</a>
В основном я ищу способ удалить все найденные повторяющиеся значения и показать 1 из каждой ссылки.
Ответы
Ответ 1
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]
очень быстр в сравнении.
Ответ 2
Использовать метод jQuery $. unique()
Подробнее см. http://api.jquery.com/jQuery.unique/
Ответ 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();
}
});
Ответ 4
@interjay @Georg Fritzsche
Ваше исправление не работает в моем случае, поэтому я создаю другую версию:
var seen='';
$('a').each(function(){
var see=$(this).text();
if(seen.match(see)){
$(this).remove();}
else{
seen=seen+$(this).text();
}
});
Надежды на это дают кому-то еще действующее альтернативное короткое исправление на всякий случай.
Ответ 5
$(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();
}
});
});
});
Ответ 6
Быстрый и простой способ -
$("a").each(function(){
if($(this).parent().length)
$("a:contains('" + $(this).html() + "')").not(this).remove();
});
Ответ 7
Хорошие люди.
Вот мой
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;
}
}
}
Привет
Ответ 8
$('.photo').each(function (index) {
if (index > 0) {
$(this).remove();
}
});