以下面的字符串为例:
var string = "spanner, span, spaniel, span";
从这个字符串中我想找到重复的单词,删除所有重复项,保持单词出现一次,然后输出修改后的字符串。
在这个例子中将是:
var string = "spanner, span, spaniel";
我已经设置了一个用于测试的jsFiddle:http://jsfiddle.net/p2Gqc/
请注意,字符串中单词的顺序不一致,每个字符串的长度也不一致,因此正则表达式不会在这里完成工作我不这么认为。我正在考虑将字符串拆分成数组的方法吗?但是我希望它尽可能地在客户端上发挥作用并超级快速......
答案 0 :(得分:34)
这样的事情怎么样?
拆分字符串,获取数组,过滤它以删除重复的项目,然后将它们连接起来。
var uniqueList=string.split(',').filter(function(item,i,allItems){
return i==allItems.indexOf(item);
}).join(',');
$('#output').append(uniqueList);
对于不支持的浏览器,您可以通过在js中添加它来解决它。
请参阅Filter
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;
};
}
答案 1 :(得分:3)
如果上述情况不符合您的另一种方式:
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(", ");
答案 2 :(得分:1)
其他答案都可以正常工作,尽管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(', ');
答案 3 :(得分:1)
<script type="text/javascript">
str=prompt("Enter String::","");
arr=new Array();
arr=str.split(",");
unique=new Array();
for(i=0;i<arr.length;i++)
{
if((i==arr.indexOf(arr[i]))||(arr.indexOf(arr[i])==arr.lastIndexOf(arr[i])))
unique.push(arr[i]);
}
unique.join(",");
alert(unique);
</script>
此代码块将删除句子中的重复单词。
if语句的第一个条件,即(i == arr.indexOf(arr [i]))将包括重复单词首次出现在结果中(此代码中的变量唯一)。
第二个条件(arr.indexOf(arr [i])== arr.lastIndexOf(arr [i]))将包括所有非重复的单词。
答案 4 :(得分:1)
通过使用正向前瞻,您可以剥离所有重复的单词。
正则表达式 /(\b\S+\b)(?=.*\1)/ig
,其中
\b
- 匹配字边界\S
- 匹配不是空格的字符(标签,换行符等)?=
- 用于积极向前看ig
- 分别用于区分大小写的全局搜索的标记+,*
- 量词。 + - &gt; 1或更多,* - &gt; 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);
&#13;
唯一需要注意的是,此正则表达式仅保留找到的重复单词的最后一个实例,并剥离所有其余单词。对于那些只关心重复但不关心单词顺序的人来说,这应该有效!
答案 5 :(得分:0)
// 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);
答案 6 :(得分:0)
是一个易于理解和快速的代码,用于删除字符串中的重复单词:
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
这很简单,可以解决您的问题。希望这可以帮助。干杯:)
答案 7 :(得分:0)
要删除所有重复的字词,我使用以下代码:
<script>
function deleteDuplicate(a){a=a.toString().replace(/ /g,",");a=a.replace(/[ ]/g,"").split(",");for(var b=[],c=0;c<a.length;c++)-1==b.indexOf(a[c])&&b.push(a[c]);b=b.join(", ");return b=b.replace(/,/g," ")};
document.write(deleteDuplicate("g g g g"));
</script>
答案 8 :(得分:-1)
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"};
对于上述情况,字符串[]中只有三个元素将被唯一存储。