11

以下面的字符串为例:

var string = "spanner, span, spaniel, span";

我想从这个字符串中找到重复的单词,删除所有重复的单词,保持单词出现一次,然后输出修改后的字符串。

在这个例子中是:

var string = "spanner, span, spaniel";

我已经设置了一个用于测试的 jsFiddle:http: //jsfiddle.net/p2Gqc/

请注意,字符串中单词的顺序并不一致,每个字符串的长度也不一致,因此我认为正则表达式不会在这里完成工作。我正在考虑将字符串拆分为数组的方式?但我希望它对客户端尽可能轻且超级快速......

4

10 回答 10

44

这样的事情怎么样?

拆分字符串,获取数组,过滤它以删除重复项,然后将它们加入。

var uniqueList=string.split(',').filter(function(item,i,allItems){
    return i==allItems.indexOf(item);
}).join(',');

$('#output').append(uniqueList);

小提琴

对于不支持的浏览器,您可以通过在 js.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;
  };
}
于 2013-05-30T19:10:41.290 回答
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(", ");
于 2013-05-30T19:29:22.513 回答
2

使用正则表达式的替代解决方案

通过使用积极的前瞻,您可以去除所有重复的单词。

正则表达式/(\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);

唯一需要注意的是,这个正则表达式只保留找到的重复单词的最后一个实例,并去掉所有其余的实例。对于那些只关心重复而不关心单词顺序的人来说,这应该有效!

于 2017-09-22T12:16:56.740 回答
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])) 将包括所有不重复的单词。

于 2014-08-16T19:05:48.630 回答
1

下面是一个易于理解且快速的代码,用于删除字符串中的重复单词:

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

这么简单就可以解决你的问题。希望这可以帮助。干杯:)

于 2014-08-17T10:32:30.560 回答
1
// 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);

Live DEMO

于 2013-05-30T19:12:21.670 回答
1

其他两个答案都可以正常工作,尽管filterPSL 使用的数组方法已添加到 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(', ');
于 2013-05-30T19:20:03.293 回答
1

要删除所有重复的单词,我使用以下代码:

<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>
于 2016-09-14T18:45:09.983 回答
1

getUniqueWordString函数中,我们过滤多余的单词,然后用分隔符连接回来。如果输入字符串中的单词同时存在大写和小写,则添加了一种情况。

function getUniqueWordString(str, delimiter) {
    return str.toLowerCase().split(delimiter).filter(function(e, i, arr) {
        return arr.indexOf(e, i+1) === -1;
    }).join(delimiter);
}

let str = "spanner, span, spaniel, span, SPAN, SpaNiel";
console.log(getUniqueWordString(str, ", "))
于 2021-11-05T04:48:55.410 回答
-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可以轻松遍历unique。

我喜欢这个有三个原因。首先,它适用于 IE8 或任何其他浏览器。

第二。它更加优化并保证具有独特的结果。

最后,它适用于输入中有空格的其他字符串数组,例如

var string[] = {"New York", "New Jersey", "South Hampsire","New York"};

对于上述情况,string[] 中只有三个元素会被唯一存储。

于 2014-04-03T09:39:29.543 回答