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

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

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

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

Что в этом примере было бы:

var string = "spanner, span, spaniel";

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

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

javascript,jquery,arrays,string,

11

Ответов: 9


32 голосов принято

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

разделите строку, получите массив, var uniqueList = string . split ( ',' ). filter ( function ( item , i , allItems ) { return i == allItems . indexOf ( item ); }). join ( ',' ); $ ( '#output' ). append ( uniqueList ); чтобы удалить дубликаты, присоедините их.

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

скрипка

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

См. Фильтр

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

3

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

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

1

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

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

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


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

Live DEMO

JavaScript, JQuery, массивы, строки,
Похожие вопросы