Insertion d'une chaîne à la position x d'une autre chaîne


237

J'ai deux variables et j'ai besoin d'insérer une chaîne bdans la chaîne aau point représenté par position. Le résultat que je recherche est "Je veux une pomme". Comment puis-je faire cela avec JavaScript?

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

Réponses:


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


Facultatif: comme méthode prototype de String

Ce qui suit peut être utilisé pour épisser textau sein d'une autre chaîne à une valeur souhaitée index, avec un removeCountparamètre facultatif .

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


3
Pour les chaînes longues, cette solution est plus rapide (car elle copie moins) que la solution de nickf.
pts

35
Cette solution n'est pas plus rapide. J'étais curieux à ce sujet et j'ai dirigé un jsperf. Ceci est une note pour quiconque lira ceci à l'avenir. jsperf.com/javascript-string-splice . Testé dans les derniers FF / Chrome / IE10 / IE9. J'utiliserais l'approche lean nickf par rapport à celle-ci pour la clarté et les performances.
junkyspace

3
Eh bien, c'est très possible. La réponse est ici vieille de près de 3 ans, la majorité des navigateurs et des versions à l'époque étaient en effet beaucoup plus rapides avec une jointure Array (en particulier IE).
jAndy

1
Je vous demande pardon d'avoir relancé une question aussi ancienne, mais pour ce que je vaux, ce devrait être var output = [a.slice(0, position + 1), b, a.slice(position)].join('');de donner aux PO "Je veux une pomme", au lieu de "Je veux une pomme".
paulvs

13
@PaulVon Ce n'est jamais faux de corriger quelque chose, donc pas besoin de pardonner. Quoi qu'il en soit, je suis en quelque sorte en désaccord. Fonctionnellement fait ce que son intention est de faire, insérer une chaîne à une certaine position dans une autre chaîne. En fait, la chaîne insérée devrait être comme "an", ce qui serait plus correct dans ce cas.
jAndy

262
var output = a.substring(0, position) + b + a.substring(position);

Modifier: remplacé .substrpar .substringcar .substrest désormais une fonction héritée (par https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )


47
Selon @junkyspace jsperf.com/javascript-string-splice , cette réponse est 640x plus rapide que celle de jAndy.
Paulo Coghi - Rétablir Monica

5
String.prototype.substrest obsolète maintenant. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie

2
substring dans ce cas est un remplacement direct pour le dépréciée substr, donc la réponse devient: var output = a.substring(0, position) + b + a.substring(position);.
Seafish

Ce n'est pas strictement obsolète, mais hérité, donc une bonne idée de le remplacer car il deviendra probablement obsolète, et il est recommandé par MDN de l'utiliser.substring
froggomad

32

Vous pouvez ajouter cette fonction à la classe de chaîne

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

afin que vous puissiez l'utiliser sur n'importe quel objet chaîne:

var my_string = "abcd";
my_string.insertAt(1, "XX");

3
C'est une mauvaise pratique de modifier le prototype d'objet natif: stackoverflow.com/questions/14034180/…
jhujhul

10

L' utilisation de littéraux de chaîne ES6 serait beaucoup plus courte:

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'


9

Peut-être que c'est encore mieux si vous déterminez la position en utilisant indexOf () comme ceci:

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

puis appelez la fonction comme ceci:

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

Notez que j'ai mis un espace après le "an" dans l'appel de fonction, plutôt que dans l'instruction return.


2
Ce n'est pas ce qu'on lui a demandé. Même si c'était le cas, cela ne fonctionnerait pas si vous avez plusieurs occurrences de la sous
elachell

6

La bibliothèque Underscore.String possède une fonction qui n'insère

insert (chaîne, index, sous-chaîne) => chaîne

ainsi

insert("Hello ", 6, "world");
// => "Hello world"

Pas par moi, mais probablement parce qu'il n'y avait aucune mention de cette bibliothèque dans la question. Mais il ne semble pas non plus exclure d'autres bibliothèques IMO ..
Dennis98

1
Même si je n'aime pas utiliser les bibliothèques à moins que cela ne soit nécessaire, j'ai voté pour compenser le downvote: P
froggomad

3

essayer

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

ou solution regexp

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


2
var array = a.split(' '); 
array.splice(position, 0, b);
var output = array.join(' ');

Ce serait plus lent, mais vous vous occuperez de l'ajout d'espace avant et après un. Aussi, vous devrez changer la valeur de la position (à 2, c'est plus intuitif maintenant)


2

Solution rapide! Si vous ne souhaitez pas ajouter manuellement un espace, vous pouvez le faire:

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

(modifier: je vois que cela est en fait répondu ci-dessus, désolé!)


2

Si le lookbehind d'ES2018 est disponible , une autre solution d'expression régulière, qui l'utilise pour "remplacer" à une position de largeur nulle après le Nème caractère (similaire à celle de @Kamil Kiełczewski, mais sans stocker les caractères initiaux dans un groupe de capture):

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


1

Eh bien juste un petit changement car les sorties de solution ci-dessus

"Je veux une pomme"

au lieu de

"Je veux une pomme"

Pour obtenir la sortie en tant que

"Je veux une pomme"

utilisez le code modifié suivant

var output = a.substr(0, position) + " " + b + a.substr(position);

13
oui, ce n'est probablement pas souhaitable dans ce cas, mais l'ajout automatique d'un espace supplémentaire n'est presque certainement pas souhaitable dans tous les cas.
nickf

12
Les bonnes solutions ne seraient-elles pas d'ajouter les espaces dans la chaîne = 'an', de cette façon vous pouvez réutiliser la fonction
Tosh
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.