Javascript 从HTML字符串中删除重复元素
我有这个HTML:Javascript 从HTML字符串中删除重复元素,javascript,jquery,html,regex,Javascript,Jquery,Html,Regex,我有这个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'> <inpu
<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'>
此.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'>
我认为您可以使用一些映射对象来存储ID:
var map = {};
$(unescape(HtmlString)).each(function() {
if (map[this.id]) {
$(this).remove();
}
else {
map[this.id] = true;
}
});
你不能用正则表达式解析html。它容易出错。如果你没有更好的解决方案,你可以试试这个
<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='([^']*)'>(?=.*?<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='\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();
}
}
});
$(unescape(HtmlString)).filter(“.allDomObjects”).each(function(){
如果($('[id=“'+this.id+'“]')).length>1){
对于(var i=1;i<$('[id=“'+this.id+''“]])。长度,i++){
$('[id=“'+this.id+'“]')[i].remove();
}
}
});
到目前为止,您为满足这一需求而编写的代码遇到了什么问题?我不知道如何实现这一点?我们可以使用document.createElement并检查重复的代码,但这太多了,当我们通过2或3行代码实现这一点时,编写额外的代码可能不好。如果我没记错的话,我们可以用“Regx”来做,LOC最多是4行或5行。你能解释一下你最初是如何陷入这种情况的吗?我只想再次检查您是否正在尝试修复问题的正确端。我通过ajax从客户端服务器获取此字符串,但我没有更改此字符串的权限。您有两个ID。id属性值应该是唯一的。您应该在事前解决问题,而不是事后解决问题。请查看此行$('[id=“'+this.id+''“])[i].remove();这将从DOM中删除,而不是从HTML字符串中删除。因此,如果您在id上绑定了任何事件,那么它将只绑定到具有此id的第一个元素,同时从HTML中删除也没有意义将其保留在DOM中?不
<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='([^']*)'>(?=.*?<input\s+type=hidden'\s+class='allDomObjects'\s+value='[^']*'\s+id='\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();
}
}
});