Das Javascript splice
funktioniert nur mit Arrays. Gibt es eine ähnliche Methode für Zeichenfolgen? Oder sollte ich meine eigene benutzerdefinierte Funktion erstellen?
Die Methoden substr()
und substring()
geben nur die extrahierte Zeichenfolge zurück und ändern die ursprüngliche Zeichenfolge nicht. Ich möchte einen Teil aus meiner Zeichenfolge entfernen und die Änderung auf die ursprüngliche Zeichenfolge anwenden. Darüber hinaus replace()
funktioniert die Methode in meinem Fall nicht, da ich Teile entfernen möchte, die aus einem Index beginnen und an einem anderen Index enden, genau wie ich es mit der splice()
Methode tun kann . Ich habe versucht, meine Zeichenfolge in ein Array zu konvertieren, aber dies ist keine ordentliche Methode.
javascript
ProllyGeek
quelle
quelle
str.split
könnte die Funktion sein, die Sie suchen: google.com/#q=javascript+string+splitstr = str.slice()
?return string.slice(0, startToSplice) + string.slice(endToSplice);
, Nein?Antworten:
Es ist schneller, die Zeichenfolge zweimal in Scheiben zu schneiden:
als einen Split gefolgt von einem Join (Kumar Harsh's Methode) wie folgt zu verwenden:
Hier ist ein jsperf , der die beiden und einige andere Methoden vergleicht. (jsperf ist seit einigen Monaten nicht mehr verfügbar. Bitte schlagen Sie in den Kommentaren Alternativen vor.)
Obwohl der obige Code Funktionen implementiert, die die allgemeine Funktionalität von reproduzieren
splice
, ändert die Optimierung des Codes für den vom Fragesteller dargestellten Fall (dh das Hinzufügen von nichts zur geänderten Zeichenfolge) nichts an der relativen Leistung der verschiedenen Methoden.quelle
String.prototype.splice = function (index, count, add) { return this.slice(0, index) + (add || "") + this.slice(index + count); }
Beachten Sie jedoch, dass es nicht genau so funktioniert wie die Array-Spleißmethode, da Zeichenfolgen unveränderlich sind (Sie können sie nach dem Erstellen nicht mehr ändern). Die Verwendung wäre also wievar s="ss"; s = s.splice(0,1,"t");
var StringUtils={'StringSplice':/*func def*/};
wäre Standard für die Manipulation von Strings, da Sie gesagt haben, dass es unveränderlich ist.Bearbeiten
Dies ist natürlich nicht der beste Weg, um einen String zu "spleißen". Ich hatte dies als Beispiel für die Implementierung angegeben, die fehlerhaft und aus einem split (), splice () und join () sehr offensichtlich ist. Für eine weitaus bessere Implementierung siehe Louis ' Methode.
Nein, es gibt keine
String.splice
, aber Sie können dies versuchen:Mir ist klar, dass es keine
splice
Funktion wie in Arrays gibt, daher müssen Sie den String in ein Array konvertieren. Pech...quelle
"asdsd".indexOf('s');
[...str]
Hier ist ein nettes kleines Curry, das eine bessere Lesbarkeit bietet (IMHO):
Die Signatur der zweiten Funktion ist identisch mit der
Array.prototype.splice
Methode.Ich weiß, dass es bereits eine akzeptierte Antwort gibt, hoffe aber, dass dies nützlich ist.
quelle
'method'
Parameter zuzulassen, sodass Sie einen übergebenArray.prototype[method]
und Zeichenfolgen vollständig wie Arrays behandeln können. Mit dieser Option können Sie den eigentlichen Prozess auch auf eine andere Funktion abstrahieren. Wenn keine Zeichenfolge vorhanden ist, geben Sie eine Funktion zurück, die die Zeichenfolge übernimmt und das Curry umkehrt :mutate()(1, 1, '1')('101')
; Sie können sogar die Argumente duckType verwenden, um das Curry vom leeren Aufruf zu befreien - und sogar eine Methode selbst kapseln. Wenn Sie diese Dinge benötigen, können Sie in die aussehen Command - Muster though. Einfach hier spucken.Ich möchte eine einfachere Alternative sowohl zur Kumar / Cody- als auch zur Louis-Methode anbieten. Bei allen Tests, die ich durchgeführt habe, ist die Leistung genauso schnell wie bei der Louis-Methode (Benchmarks siehe Geigen-Tests).
Sie können es so verwenden:
Siehe Testergebnisse: https://jsfiddle.net/0quz9q9m/5/
quelle
, otherwise the third argument is not optional. This implementation also doesn't take care of
Gegensatz zu anderen Vorschlägen mindestens `+ (insertString ||" ") +` anstelle von `+ insertString + startIndex <0` ausführen. Tolles Beispiel für die VerwendungEs scheint eine Menge Verwirrung zu geben, die nur in Kommentaren von elclanrs und raina77ow angesprochen wurde. Lassen Sie mich daher eine klarstellende Antwort posten.
Klärung
Von "
string.splice
" kann man erwarten, dass es, wie das für Arrays:Das Problem ist, dass die 3D-Anforderung nicht erfüllt werden kann, da Zeichenfolgen unveränderlich sind (siehe: 1 , 2 ). Ich habe hier den engagiertesten Kommentar gefunden :
In Anbetracht dessen kann man erwarten, dass das "
string.splice
" Ding nur:was ist was
substr
tut; oder alternativ,Das ist das Thema des nächsten Abschnitts.
Lösungen
Wenn Sie sich für die Optimierung interessieren, sollten Sie wahrscheinlich die Implementierung von Mike verwenden:
Die Behandlung des Index außerhalb der Grenzen kann jedoch variieren. Abhängig von Ihren Anforderungen möchten Sie möglicherweise:
oder auch
Wenn Sie sich nicht für die Leistung interessieren, können Sie Kumars Vorschlag anpassen, der einfacher ist:
Performance
Der Leistungsunterschied nimmt mit der Länge der Saite drastisch zu. jsperf zeigt , dass für Strings mit einer Länge von 10 die letztere Lösung (Teilen und Verbinden) doppelt so langsam ist wie die erstere Lösung (mit Slice), für Strings mit 100 Buchstaben x5 und für Strings mit 1000 Buchstaben x50 in Ops / sek es ist:
Beachten Sie, dass ich das 1. und 2. Argument geändert habe, als ich von 10 Buchstaben auf 100 Buchstaben verschoben habe (trotzdem bin ich überrascht, dass der Test für 100 Buchstaben schneller abläuft als der für 10 Buchstaben).
quelle
Verwenden Sie einfach substr für string
Ex.
Ergebnis = Hallo Welt!
quelle
Was auch immer das Hinzufügen einer Spleißmethode zu einem String-Prototyp ist, kann nicht transparent für die Spezifikation sein ...
Lassen Sie uns jemanden erweitern:
quelle
Die Methode Louis ' Antwort als
String
Prototypfunktion:Beispiel:
quelle
Die spliceSlice- Methode von Louis schlägt fehl, wenn der Add-Wert 0 oder andere falsche Werte ist. Hier ist ein Fix:
quelle
Ich habe mein Problem mit diesem Code gelöst, ist ein gewisser Ersatz für den fehlenden Spleiß.
Ich musste ein Zeichen vor / nach einem bestimmten Wort entfernen. Nachdem Sie die Position erhalten haben, wird die Zeichenfolge in zwei Teile geteilt und dann durch flexibles Entfernen von Zeichen mithilfe eines Versatzes neu zusammengesetzt
pos
quelle