Удалить появление повторяющихся слов в строке
В качестве примера возьмем следующую строку:
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);
Для не поддерживающих браузеров вы можете решить это, добавив это в свои 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"};
для вышеуказанного случая в строке [] будет сохраняться только три элемента.