Einfügen einer Zeichenfolge an Position x einer anderen Zeichenfolge

237

Ich habe zwei Variablen und muss an der durch dargestellten Stelle eine Zeichenfolge bin eine Zeichenfolge einfügen . Das gesuchte Ergebnis ist "Ich will einen Apfel". Wie kann ich das mit JavaScript machen?aposition

var a = 'I want apple';
var b = ' an';
var position = 6;
Sami
quelle

Antworten:

376

var a = "I want apple";
var b = " an";
var position = 6;
var output = [a.slice(0, position), b, a.slice(position)].join('');
console.log(output);


Optional: Als Prototypmethode von String

Das Folgende kann verwendet werden, um textinnerhalb einer anderen Zeichenfolge indexmit einem optionalen removeCountParameter an einer gewünschten Stelle zu verbinden .

if (String.prototype.splice === undefined) {
  /**
   * Splices text within a string.
   * @param {int} offset The position to insert the text at (before)
   * @param {string} text The text to insert
   * @param {int} [removeCount=0] An optional number of characters to overwrite
   * @returns {string} A modified string containing the spliced text.
   */
  String.prototype.splice = function(offset, text, removeCount=0) {
    let calculatedOffset = offset < 0 ? this.length + offset : offset;
    return this.substring(0, calculatedOffset) +
      text + this.substring(calculatedOffset + removeCount);
  };
}

let originalText = "I want apple";

// Positive offset
console.log(originalText.splice(6, " an"));
// Negative index
console.log(originalText.splice(-5, "an "));
// Chaining
console.log(originalText.splice(6, " an").splice(2, "need", 4).splice(0, "You", 1));
.as-console-wrapper { top: 0; max-height: 100% !important; }

jAndy
quelle
3
Bei langen Zeichenfolgen ist diese Lösung schneller (weil sie weniger kopiert) als die Lösung von nickf.
Punkte
35
Diese Lösung ist nicht schneller. Ich war neugierig und lief ein jsperf. Dies ist eine Notiz für jeden, der dies in Zukunft liest. jsperf.com/javascript-string-splice . Getestet in den neuesten FF / Chrome / IE10 / IE9. Ich würde Lean Nickfs Ansatz gegenüber diesem verwenden, um sowohl Klarheit als auch Leistung zu erzielen.
Junkyspace
3
Nun, das ist sehr gut möglich. Die Antwort hier ist fast 3 Jahre alt, die meisten Browser und Versionen waren damals mit einem Array- Join (insbesondere IE) tatsächlich viel schneller .
jAndy
1
Ich bitte um Verzeihung, eine so alte Frage wiederbelebt zu haben, aber für das, was ich wert bin, sollte es sein var output = [a.slice(0, position + 1), b, a.slice(position)].join('');, den OPs "Ich will einen Apfel" anstelle von "Ich will einen Apfel" zu geben.
Paulvs
13
@PaulVon Es ist nie falsch, etwas zu korrigieren, also keine Entschuldigung. Jedenfalls bin ich anderer Meinung. Die Funktion macht das, was sie beabsichtigt, indem sie eine Zeichenfolge an einer bestimmten Position in eine andere Zeichenfolge einfügt. Eigentlich sollte die eingefügte Zeichenfolge wie "an" sein, was in diesem Fall korrekter wäre.
Andy
261
var output = a.substring(0, position) + b + a.substring(position);

Bearbeiten: ersetzt .substrdurch .substringweil .substrist jetzt eine Legacy-Funktion (per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )

nickf
quelle
47
Laut @junkyspace jsperf.com/javascript-string-splice ist diese Antwort 640x schneller als die von jAndy.
Paulo Coghi - Stellen Sie Monica
5
String.prototype.substrist jetzt veraltet. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie
2
substring In diesem Fall handelt es sich um einen direkten Ersatz für das Veraltete substr, sodass die Antwort lautet : var output = a.substring(0, position) + b + a.substring(position);.
Seafish
Es ist nicht streng veraltet, sondern ein Vermächtnis, daher eine gute Idee, es zu ersetzen, da es wahrscheinlich veraltet sein wird, und es wird von MDN empfohlen, es zu verwenden.substring
froggomad
32

Sie können diese Funktion zur Zeichenfolgenklasse hinzufügen

String.prototype.insert_at=function(index, string)
{   
  return this.substr(0, index) + string + this.substr(index);
}

Damit Sie es für jedes Zeichenfolgenobjekt verwenden können:

var my_string = "abcd";
my_string.insertAt(1, "XX");
jasin_89
quelle
3
Es ist eine schlechte Praxis, den nativen Objektprototyp zu ändern: stackoverflow.com/questions/14034180/…
jhujhul
10

Die Verwendung von ES6-String-Literalen wäre viel kürzer:

const insertAt = (str, sub, pos) => `${str.slice(0, pos)}${sub}${str.slice(pos)}`;
    
console.log(insertAt('I want apple', ' an', 6)) // logs 'I want an apple'

Stefan J.
quelle
9

Vielleicht ist es sogar noch besser, wenn Sie die Position mit indexOf () wie folgt bestimmen :

function insertString(a, b, at)
{
    var position = a.indexOf(at); 

    if (position !== -1)
    {
        return a.substr(0, position) + b + a.substr(position);    
    }  

    return "substring not found";
}

Rufen Sie dann die Funktion folgendermaßen auf:

insertString("I want apple", "an ", "apple");

Beachten Sie, dass ich im Funktionsaufruf ein Leerzeichen nach dem "an" und nicht in die return-Anweisung setze.

paulo62
quelle
2
Dies wurde nicht gefragt. Selbst wenn dies der Fall wäre, würde dies nicht funktionieren, wenn Sie mehrere Vorkommen des "at"
-Substrings haben
6

Die Underscore.String- Bibliothek verfügt über eine Funktion zum Einfügen

Einfügen (Zeichenfolge, Index, Teilzeichenfolge) => Zeichenfolge

wie so

insert("Hello ", 6, "world");
// => "Hello world"
svarog
quelle
Nicht von mir, aber wahrscheinlich, weil diese Bibliothek in der Frage nicht erwähnt wurde. Aber er scheint auch andere Bibliotheken IMO nicht auszuschließen.
Dennis98
1
Obwohl ich es nicht mag, Bibliotheken zu benutzen, wenn es nicht nötig ist, habe ich mich hochgestimmt, um die Abwertung auszugleichen: P
froggomad
3

Versuchen

a.slice(0,position) + b + a.slice(position)

oder Regexp-Lösung

"I want apple".replace(/^(.{6})/,"$1 an")

Kamil Kiełczewski
quelle
2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

Dies wäre langsamer, kümmert sich jedoch um das Hinzufügen von Leerzeichen vor und nach dem. Außerdem müssen Sie den Wert der Position ändern (auf 2, es ist jetzt intuitiver).

Ravindra Sane
quelle
2

Schnelle Lösung! Wenn Sie kein Leerzeichen manuell hinzufügen möchten, können Sie dies tun:

var a = "I want apple";
var b = "an";
var position = 6;
var output = [a.slice(0, position + 1), b, a.slice(position)].join('');
console.log(output);

(edit: ich sehe, dass dies oben tatsächlich beantwortet wird, sorry!)

K. Yu
quelle
2

Wenn das Lookbehind von ES2018 verfügbar ist , eine weitere Regexp-Lösung, die es verwendet, um an einer Position mit einer Breite von Null nach dem N-ten Zeichen zu "ersetzen" (ähnlich wie bei @Kamil Kiełczewski, jedoch ohne die Anfangszeichen in einer Erfassungsgruppe zu speichern):

"I want apple".replace(/(?<=^.{6})/, " an")

Dlauzon
quelle
1

Nun, nur eine kleine Änderung, weil die oben genannten Lösungsausgaben

"Ich will einen Apfel"

anstatt

"Ich will einen Apfel"

Um die Ausgabe als zu erhalten

"Ich will einen Apfel"

Verwenden Sie den folgenden geänderten Code

var output = a.substr(0, position) + " " + b + a.substr(position);
Clyde Lobo
quelle
13
Ja, dies ist in diesem Fall wahrscheinlich nicht wünschenswert , aber das automatische Hinzufügen eines zusätzlichen Speicherplatzes ist mit ziemlicher Sicherheit nicht in allen Fällen wünschenswert .
Nickf
12
Wäre es nicht die richtige Lösung, die Leerzeichen in der Zeichenfolge = 'an' hinzuzufügen, so können Sie die Funktion wiederverwenden
Tosh