现在先撇开性能不谈,就算是谈性能,也是把函数循环成千上万才看到几毫秒的差距,因此我才不管它呢。我首先考虑的是类库的大小,这就要求,不要才分膨胀其里的函数。
我在群里提出的问题是,要为一个className为"aaa eee bbb"的元素节点添加多两个类名,“aaa”,"ddd",如果让此实现尽可能的简单,不能用框架,不能用for循环。
经过一轮的跑题(主要如何用hash进行去重,总难免还是谈到性能上),最好得到两个比较好的方案:
var str= 'aaa eee bbb aaa ddd'; var o = {}; var str= str.replace(/\S+/g, function($) { return o[$] ? '' : (o[$]=$) }); alert(str);运行代码
var str= 'aaa eee bbb aaa ddd'; var reg = /(\b\S+\b)(?=.*?\1)/g; alert(str.replace(reg,""));运行代码
方案2虽然精简,但还存在两个问题,1对b字母的区分,2不能移除空白,如碰到像 'a aa a-a a-b' 就无能为力了,希望高手能跟进。
方案3,感谢abcd友情提供:
var str= "aaa bbb eee aaa bbb kkk";
var reg = /(^|\s)(\S+)\s(?=(?:\S+\s)*\2(?:\s|$))/g;
alert(str.replace(reg,"$1"));
var str= 'a aa a a-b a-a a-b ' ;
var reg = /(^|\s)(\S+)(?=\s(?:\S+\s)*\2(?:\s|$))/g;
alert(str.replace(reg,""));
运行代码
下面测试运行框,大家可以把代码放到里面进行测试。
//---------------------这是示例----- var reg = /(^|\s)(\S+)(?=\s(?:\S+\s)*\2(?:\s|$))/g; var str= 'a aa a a-b a-a a-b' ; alert(str.replace(reg,"")); var str2= 'aaa bbb ccc aaa bbb eee' ; alert(str2.replace(reg,"")); //-----------------------------------