Удаление вхождений повторяющихся слов в строке

возьмите следующую строку в качестве примера:

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

из этой строки я хотел бы найти повторяющиеся слова, удалить все дубликаты, сохраняя одно вхождение слова на месте, а затем вывести пересмотренную строку.

который в этом примере будет:

var string = "spanner, span, spaniel";

Я настроил jsFiddle для тестирования:http://jsfiddle.net/p2Gqc/

обратите внимание, что порядок слов в строке не соответствует ни длина каждой строки, поэтому регулярное выражение не будет выполнять работу здесь, я не думаю. Я думаю что-то вроде разделения строки на массив? Но я хотел бы, чтобы это было как можно более легким для клиента и супер быстрым...

9 ответов


Как насчет чего-то вроде этого?

разделите строку, получите массив, отфильтруйте его, чтобы удалить дубликаты элементов, присоедините их обратно.

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(", ");

оба других ответа будут работать нормально, хотя filter метод массива, используемый PSL, был добавлен в 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(', ');

<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.e (i= = arr.indexOf (arr[i])) будет включать первое появление повторяющегося слова к результату(variale уникальный в этом коде).

второе условие (arr.indexOf (arr[i])==arr.lastIndexOf (arr[i])) будет включать все неповторяющиеся слова.


альтернативное решение с использованием регулярного выражения

используя положительный lookahead, вы можете удалить все повторяющиеся слова.

выражение /(\b\S+\b)(?=.*)/ig, где

  • \b - соответствует границе слова
  • \S - соответствует символу, который не является пробелом (вкладки, разрывы строк и т. д.)
  • ?= - используется для положительных lookahead
  • ig - флаги Для в-casesensitive, глобальные поиск соответственно
  • +,* - кванторы. + - >1 или более, * - > 0 или более
  • () - определить группу
  • - back-ссылка на результаты предыдущей группы

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)(?=.*)/ig, '');
var result2 = string2.replace(/(\b, \w+\b)(?=.*)/ig, '');
var result3 = string3.replace(/(\b, \w+\b)(?=.*)/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);

Live DEMO


ниже приведен простой для понимания и быстрый код для удаления повторяющихся слов в строке:

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

Как просто, как это может решить вашу проблему. Надеюсь, это поможет. Ура :)


удалить все повторяющиеся слова, я использую этот код:

<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>

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 или любым другим браузером.