Entfernen Sie Vorkommen von doppelten Wörtern in einer Zeichenfolge
Lesezeit: 6 Minuten
CLIown
Nehmen Sie als Beispiel die folgende Zeichenfolge:
var string = "spanner, span, spaniel, span";
Aus dieser Zeichenfolge möchte ich die doppelten Wörter finden, alle Duplikate entfernen und ein Vorkommen des Wortes beibehalten und dann die überarbeitete Zeichenfolge ausgeben.
Beachten Sie, dass die Reihenfolge der Wörter in der Zeichenfolge nicht konsistent ist, ebenso wenig wie die Länge der einzelnen Zeichenfolgen, so dass eine Regex hier die Aufgabe meiner Meinung nach nicht erfüllen wird. Ich denke etwas in der Art, die Zeichenfolge in ein Array aufzuteilen? Aber ich möchte, dass es für den Kunden so leicht wie möglich und superschnell ist…
Schöne Geige, aber dahinter steckt eigentlich keine Logik… Schau mal rein String.split(). Sie können dann das Array von Wörtern durchlaufen und auf Duplikate prüfen.
– MCL
30. Mai ’13 um 19:09
a) Erstellen Sie ein Array aus Ihrem String. b) über das Array iterieren und jedes Element an ein neues Array anhängen, wenn dieses Element nicht in dem neuen Array ist. c) Konvertieren Sie das neue Array in einen String.
– j08691
30. Mai ’13 um 19:10
Ich habe eine Frage. Ist die Leistung ein wichtiger Punkt? Wie lang darf eine Zeichenfolge sein (max)? Möchten Sie ALLE doppelten Wörter entfernen oder nur das erste gefundene Wort?
– Karl-André Gagnon
30. Mai ’13 um 19:10
PSL
Wie wäre es mit so etwas?
Teilen Sie die Zeichenfolge, rufen Sie das Array ab, filtern Sie es, um doppelte Elemente zu entfernen, und fügen Sie sie wieder zusammen.
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;
};
}
Vielleicht möchten Sie Ihre Saiten trimmen. Dies schlägt fehl var string = “spanner,span, spaniel, span”;
– Ceres
30. Mai ’13 um 19:12
@PSL Die Parameter, die Sie an function(item,i,allItems) übergeben, können Sie erklären, wie es funktioniert, wenn die Funktion “return i==allItems.indexOf(item)” zurückgibt. Wie Sie verstanden haben, ist allitems die gesamte Zeichenfolge, items ist jedes einzelne Element, das an die Zeichenfolge übergeben wird, aber was ist “i”?
– Viktor
28. März ’16 um 13:01
i ist der Index. indexOf gibt das erste übereinstimmende Element aus der Liste zurück allItems. Wenn Sie dies überprüfen, wird für die doppelten Elemente false zurückgegeben und anschließend aus der gefilterten Liste ausgeschlossen.
– PSL
28. März ’16 um 13:06
Kann einen guten Job machen, wenn Sie suchen, um doppelte Zeilen mit dem Knoten js readfileasync mit einer Aufteilung auf ‘n’ zu entfernen.
– manu
16. Juni ’16 um 19:41
Hirad Nikoo
Wenn keiner der oben genannten Schritte für Sie funktioniert, gibt es hier eine andere Möglichkeit:
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(", ");
Oder wenn Sie möchten, dass es in einem besseren Zustand ist, versuchen Sie Folgendes:
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(", ");
Ich verwende eine Firmenversion von ie11 (verschiedene erzwungene Kompatibilitäts-Spielereien) und dies war die einzige Lösung, die funktionierte. Danke fürs posten 🙂
– elboffor
1. Juli ’16 um 1:15
Niket Pathak
Alternative Lösung mit regulärem Ausdruck
Durch die Verwendung von positivem Lookahead können Sie alle doppelten Wörter entfernen.
Regex /(bS+b)(?=.*1)/ig, wo
b – entspricht der Wortgrenze
S – stimmt mit Zeichen überein, die kein Leerzeichen sind (Tabulatoren, Zeilenumbrüche usw.)
?= – verwendet für eine positive Vorausschau
ig – Flags für die Groß-/Kleinschreibung bzw. die globale Suche
+,* – Quantoren. + -> 1 oder mehr, * -> 0 oder mehr
() – eine Gruppe definieren
1 – Rückverweis auf die Ergebnisse der vorherigen Gruppe
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);
Die einzige Einschränkung besteht darin, dass diese Regex nur die letzte Instanz eines gefundenen doppelten Wortes behält und den Rest entfernt. Für diejenigen, die sich nur um Duplikate und nicht um die Reihenfolge der Wörter kümmern, sollte dies funktionieren!
// 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);
Beide anderen Antworten würden gut funktionieren, obwohl die filter Die von PSL verwendete Array-Methode wurde in ECMAScript 5 hinzugefügt und ist in alten Browsern nicht verfügbar.
Wenn Sie lange Zeichenfolgen verarbeiten, verwenden Sie $.inArray/Array.indexOf ist nicht die effizienteste Methode, um zu überprüfen, ob Sie ein Element schon einmal gesehen haben (es würde jedes Mal das Scannen des gesamten Arrays erfordern). Stattdessen könnten Sie jedes Wort als Schlüssel in einem Objekt speichern und Hash-basierte Lookups nutzen, die viel schneller sind, als ein großes Array zu lesen.
var tmp={};
var arrOut=[];
$.each(string.split(', '), function(_,word){
if (!(word in tmp)){
tmp[word]=1;
arrOut.push(word);
}
});
arrOut.join(', ');
Dieser Codeblock entfernt doppelte Wörter aus einem Satz.
die erste Bedingung der if-Anweisung, dh (i==arr.indexOf(arr[i])) enthält das erste Vorkommen eines sich wiederholenden Wortes im Ergebnis (variale eindeutig in diesem Code).
die zweite Bedingung (arr.indexOf(arr[i])==arr.lastIndexOf(arr[i])) enthält alle sich nicht wiederholenden Wörter.
praveenak
Unten ist ein leicht verständlicher und schneller Code zum Entfernen doppelter Wörter in einer Zeichenfolge:
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
So einfach kann Ihr Problem gelöst werden. Hoffe das hilft. Beifall 🙂
.
4524300cookie-checkEntfernen Sie Vorkommen von doppelten Wörtern in einer Zeichenfolgeyes
Schöne Geige, aber dahinter steckt eigentlich keine Logik… Schau mal rein String.split(). Sie können dann das Array von Wörtern durchlaufen und auf Duplikate prüfen.
– MCL
30. Mai ’13 um 19:09
a) Erstellen Sie ein Array aus Ihrem String. b) über das Array iterieren und jedes Element an ein neues Array anhängen, wenn dieses Element nicht in dem neuen Array ist. c) Konvertieren Sie das neue Array in einen String.
– j08691
30. Mai ’13 um 19:10
Ich habe eine Frage. Ist die Leistung ein wichtiger Punkt? Wie lang darf eine Zeichenfolge sein (max)? Möchten Sie ALLE doppelten Wörter entfernen oder nur das erste gefundene Wort?
– Karl-André Gagnon
30. Mai ’13 um 19:10