删除字符串中重复单词的出现次数
以下面的字符串为例:
var string = "spanner, span, spaniel, span";
从这个字符串我想找到重复的单词,删除所有重复项,保持单词出现一次,然后输出修改后的字符串。
在这个例子中将是:
var string = "spanner, span, spaniel";
我已经设置了一个jsFiddle进行测试: http : //jsfiddle.net/p2Gqc/
请注意,字符串中单词的顺序不一致,每个字符串的长度也不一致,因此正则表达式不会在这里完成工作我不这么认为。 我正在考虑将字符串拆分成数组的方法吗? 但我希望它尽可能轻松地在客户端上以及超级快速……
这样的事怎么样?
拆分字符串,获取数组,过滤它以删除重复项,然后将它们连接起来。
var uniqueList=string.split(',').filter(function(item,i,allItems){ return i==allItems.indexOf(item); }).join(','); $('#output').append(uniqueList);
小提琴
对于不支持的浏览器,您可以通过在js中添加它来解决它。
见滤镜
if (!Array.prototype.filter) { Array.prototype.filter = function(fun /*, thisp*/) { "use strict"; if (this == null) throw new TypeError(); var t = Object(this); var len = t.length >>> 0; if (typeof fun != "function") throw new TypeError(); var res = []; var thisp = arguments[1]; for (var i = 0; i < len; i++) { if (i in t) { var val = t[i]; // in case fun mutates this if (fun.call(thisp, val, i, t)) res.push(val); } } return res; }; }
如果以上不适用于您,则另一种方式:
var str = "spanner, span, spaniel, span"; str = str.replace(/[ ]/g,"").split(","); var result = []; for(var i =0; i < str.length ; i++){ if(result.indexOf(str[i]) == -1) result.push(str[i]); } result=result.join(", ");
或者如果你想让它变得更好,试试这个:
Array.prototype.removeDuplicate = function(){ var result = []; for(var i =0; i < this.length ; i++){ if(result.indexOf(this[i]) == -1) result.push(this[i]); } return result; } var str = "spanner, span, spaniel, span"; str = str.replace(/[ ]/g,"").split(",").removeDuplicate().join(", ");
其他答案都可以正常工作,尽管PSL使用的filter
数组方法已添加到ECMAScript 5中,并且在旧浏览器中不可用。
如果你正在处理长字符串,那么使用$.inArray
/ Array.indexOf
并不是检查你之前是否看过某个项目的最有效方法(它将涉及每次扫描整个数组)。 相反,您可以将每个单词存储为对象中的键,并利用基于散列的查找,这比通过大型数组读取要快得多。
var tmp={}; var arrOut=[]; $.each(string.split(', '), function(_,word){ if (!(word in tmp)){ tmp[word]=1; arrOut.push(word); } }); arrOut.join(', ');
此代码块将删除句子中的重复单词。
if语句的第一个条件ie(i == arr.indexOf(arr [i]))将包括重复单词首次出现在结果中(此代码中唯一的变量)。
第二个条件(arr.indexOf(arr [i])== arr.lastIndexOf(arr [i]))将包括所有非重复单词。
使用正则表达式的替代解决方案
通过使用正向前瞻,您可以剥离所有重复的单词。
Regex /( /(\b\S+\b)(?=.*\1)/ig
-
\b
– 匹配单词边界 -
\S
– 匹配不是空格的字符(制表符,换行符等) -
?=
– 用于积极前瞻 -
ig
– 分别用于区分大小写的全局搜索的标志 -
+,*
– 量词。 + – > 1或更多,* – > 0或更多 -
()
– 定义一个组 -
\1
– 反向引用前一组的结果
var string1 = 'spanner, span, spaniel, span'; var string2 = 'spanner, span, spaniel, span, span'; var string3 = 'What, the, the, heck'; // modified regex to remove preceding ',' and ' ' as per your scenario var result1 = string1.replace(/(\b, \w+\b)(?=.*\1)/ig, ''); var result2 = string2.replace(/(\b, \w+\b)(?=.*\1)/ig, ''); var result3 = string3.replace(/(\b, \w+\b)(?=.*\1)/ig, ''); console.log(string1 + ' => ' + result1); console.log(string2 + ' => ' + result2); console.log(string3 + ' => ' + result3);
// Take the following string var string = "spanner, span, spaniel, span"; var arr = string.split(", "); var unique = []; $.each(arr, function (index,word) { if ($.inArray(word, unique) === -1) unique.push(word); }); alert(unique);
现场演示
下面是一个易于理解和快速的代码删除字符串中的重复单词:
var string = "spanner, span, spaniel, span"; var uniqueListIndex=string.split(',').filter(function(currentItem,i,allItems){ return (i == allItems.indexOf(currentItem)); }); var uniqueList=uniqueListIndex.join(','); alert(uniqueList);//Result:spanner, span, spaniel
这很简单可以解决您的问题。 希望这可以帮助。 干杯:)
要删除所有重复的单词,我使用以下代码:
var string = "spanner, span, spaniel, span"; var strArray= string.split(","); var unique = []; for(var i =0; i< strArray.length; i++) { eval(unique[strArray] = new Object()); }
//你可以通过foreach轻松遍历独特的东西。
我喜欢这个有三个原因。 首先,它适用于IE8或任何其他浏览器。
第二。 它更加优化并保证具有独特的结果。
最后,它适用于其输入中有空格的其他字符串数组
var string[] = {"New York", "New Jersey", "South Hampsire","New York"};
对于上述情况,string []中只有三个元素将被唯一存储。