Удаление вхождений повторяющихся слов в строке
возьмите следующую строку в качестве примера:
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);
ниже приведен простой для понимания и быстрый код для удаления повторяющихся слов в строке:
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 или любым другим браузером.