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

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

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

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

В этом примере:

var string = "spanner, span, spaniel";

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

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

Ответ 1

Как насчет чего-то подобного?

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

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

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

Fiddle

Для не поддерживающих браузеров вы можете решить это, добавив это в свои 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;
  };
}

Ответ 2

Если для вас здесь не указано выше, это другой способ:

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

Ответ 6

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

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

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

<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

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

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

Regex /(\b\S+\b)(?=.*\1)/ig, где

  • \b - соответствует границе слова
  • \S - соответствует символу, который не является пробелом (вкладки, разрывы строк и т.д.)
  • ?= - используется для позитивного просмотра
  • ig - флаги для inensensitive, глобального поиска соответственно
  • +,* - кванторы. + → 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);

Ответ 9

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

Во-вторых. он более оптимизирован и гарантированно имеет уникальный результат.

Last, Он работает для другого массива String, у которого есть белое пространство на своих входах, например

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

для вышеуказанного случая в строке [] будет сохраняться только три элемента.