2014-10-29 4 views
1

У меня есть этот HTML:удалить дубликаты элементов из HTML строки

<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'> 
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'> 
<input type=hidden' class='allDomObjects' value='grid_1' id='grid_1_domType'> 

В этом окне вы можете увидеть, что имя класса такое же, но их идентификаторы различны.

Я пишу это, чтобы получить все поля:

$(unescape(HtmlString)).filter(".allDomObjects").each(function() { 
    console.log(this.id); 
}); 

Этот .each() цикл выполняется 7 раз, потому что 7 полей имеют класс "allDomObjects. Вы можете видеть, что в этой строке есть повторяющиеся элементы.

Требование:

Я хочу, чтобы удалить повторяющиеся элементы из строки HTML.

Вход:

<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'> 
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'> 
<input type=hidden' class='allDomObjects' value='grid_1' id='grid_1_domType'> 

Желаемый результат:

<input type=hidden' class='allDomObjects' value='' id='grid_17_domType'> 
<input type=hidden' class='allDomObjects' value='' id='tab_5_data'> 
<input type=hidden' class='allDomObjects' value='grid_1' id='grid_1_domType'> 
+2

И какова проблема, с которой вы столкнулись с кодом, который вы написали по этому требованию? –

+0

Я не знаю, как этого добиться? Мы можем использовать document.createElement и проверять дубликаты, но это слишком много кода, и может быть неплохо писать дополнительный код, когда мы достигаем этого на 2 или 3 строки. Если я не ошибаюсь, мы можем сделать это с помощью «Regx», а LOC - не более 4 или 5 строк. –

+2

Можете ли вы объяснить, как вы оказались в этой ситуации в первую очередь? Я просто хочу дважды проверить, что вы пытаетесь исправить правильный конец проблемы. – Tomalak

ответ

2

Я думаю, что вы можете использовать какой-либо объект карты для хранения идентификаторов:

var map = {}; 
$(unescape(HtmlString)).each(function() { 
    if (map[this.id]) { 
     $(this).remove(); 
    } 
    else { 
     map[this.id] = true; 
    } 
}); 
0

Вы не должны разобрать HTML с регулярным выражением. его склонность к ошибкам. Если вы не получите лучшего решения, вы можете попробовать это.

<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='([^']*)'>(?=.*?<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='\1'>) 

Помещенные флаги g и s .См demo.Replace по empty string.

http://regex101.com/r/sU3fA2/36

0

попробовать это. Помните, что вам нужно сохранить 1-й элемент во всех дубликатах, чтобы начать цикл с 1

$(unescape(HtmlString)).filter(".allDomObjects").each(function() { 
    if ($('[id="'+this.id+'"]').length > 1) { 
     for (var i = 1; i < $('[id="'+this.id+'"]').length, i++) { 
      $('[id="'+this.id+'"]')[i].remove(); 
     } 
    } 
}); 
+0

Можете ли вы посмотреть на эту строку $ ('[id = "' + this.id + '"]') [i] .remove(); это удалит из DOM, а не из строки HTML. –

+0

, так что, если у вас есть привязка каких-либо событий на id, это будет только привязка к 1-му элементу с этим id, также удаление из html не имеет смысла держать его в dom? нет? – zzlalani

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