删除字符串中重复单词的出现次数

以下面的字符串为例:

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 []中只有三个元素将被唯一存储。