Entfernen Sie Vorkommen von doppelten Wörtern in einer Zeichenfolge

Lesezeit: 6 Minuten

Entfernen Sie Vorkommen von doppelten Wortern in einer Zeichenfolge
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.

Was in diesem Beispiel wäre:

var string = "spanner, span, spaniel";

Ich habe eine jsFiddle zum Testen eingerichtet: http://jsfiddle.net/p2Gqc/

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

Entfernen Sie Vorkommen von doppelten Wortern in einer Zeichenfolge
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);

Geige

Bei nicht unterstützenden Browsern können Sie dies angehen, indem Sie dies in Ihre js.

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

  • 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

1641995265 767 Entfernen Sie Vorkommen von doppelten Wortern in einer Zeichenfolge
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

1641995265 52 Entfernen Sie Vorkommen von doppelten Wortern in einer Zeichenfolge
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);

Live-DEMO

1641995265 409 Entfernen Sie Vorkommen von doppelten Wortern in einer Zeichenfolge
Codebox

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

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

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.

Entfernen Sie Vorkommen von doppelten Wortern in einer Zeichenfolge
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 🙂

.

452430cookie-checkEntfernen Sie Vorkommen von doppelten Wörtern in einer Zeichenfolge

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy