Inserimento della stringa nella posizione x di un'altra stringa


237

Ho due variabili e ho bisogno di inserire una stringa bnella stringa anel punto rappresentato da position. Il risultato che sto cercando è "Voglio una mela". Come posso farlo con JavaScript?

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

Risposte:


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


Opzionale: come metodo prototipo di String

Quanto segue può essere usato per giuntare textall'interno di un'altra stringa a piacere index, con un removeCountparametro opzionale .

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
Per stringhe lunghe, questa soluzione è più veloce (perché copia meno) della soluzione di Nickf.
punti

35
Questa soluzione non è più veloce. Ero curioso di questo e gestivo un jsperf. Questa è una nota per chiunque legga questo in futuro. jsperf.com/javascript-string-splice . Testato negli ultimi FF / Chrome / IE10 / IE9. Userei l'approccio di lean nickf su questo per chiarezza e prestazioni.
junkyspace

3
Bene, è molto possibile. La risposta qui ha quasi 3 anni, la maggior parte dei browser e delle versioni di allora, infatti ha funzionato molto più velocemente con un array Array (specialmente IE).
jAndy,

1
Chiedo scusa per aver rianimato una domanda così vecchia, ma per quello che valgo dovrebbe essere var output = [a.slice(0, position + 1), b, a.slice(position)].join('');quello di dare agli OP "Voglio una mela", invece di "Voglio una mela".
paulvs,

13
@PaulVon Non è mai sbagliato correggere qualcosa, quindi non c'è bisogno di perdonare. Ad ogni modo, non sono d'accordo. Funzionalmente fa quello che intende fare, inserire una stringa in una determinata posizione all'interno di un'altra stringa. In realtà la stringa inserita dovrebbe essere come "an", che sarebbe più corretta in questo caso.
jAndy

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

Modifica: sostituito .substrcon .substringperché .substrora è una funzione legacy (per https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/substr )


47
Secondo @junkyspace jsperf.com/javascript-string-splice , questa risposta è 640x più veloce di quella di jAndy.
Paulo Coghi - Ripristina Monica l'

5
String.prototype.substrè deprecato ora. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Tivie

2
substring in questo caso è una sostituzione diretta per la obsoleta substr, quindi la risposta diventa: var output = a.substring(0, position) + b + a.substring(position);.
Pesce di mare

Non è severamente deprecato, ma ereditato, quindi una buona idea da sostituire in quanto probabilmente diventerà deprecato, ed è raccomandato da MDN da usare.substring
froggomad,

32

È possibile aggiungere questa funzione alla classe di stringa

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

in modo che tu possa usarlo su qualsiasi oggetto stringa:

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

3
Si tratta di una cattiva pratica di modificare il prototipo oggetto nativo: stackoverflow.com/questions/14034180/...
jhujhul

10

L'uso dei letterali di stringa ES6 sarebbe molto più breve:

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

Forse è ancora meglio se determini la posizione usando indexOf () in questo modo:

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

quindi chiama la funzione in questo modo:

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

Si noti che ho inserito uno spazio dopo "an" nella chiamata di funzione, piuttosto che nell'istruzione return.


2
Non è quello che è stato chiesto. Anche in questo caso, ciò non funzionerebbe se si verificano più occorrenze della sottostringa "at"
elachell,

6

La libreria Underscore.String ha una funzione che inserisce

insert (stringa, indice, sottostringa) => stringa

così

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

Non da me, ma probabilmente perché non c'era menzione di quella biblioteca nella domanda. Ma non sembra nemmeno escludere altre biblioteche dell'IMO ..
Dennis98,

1
Anche se non mi piace usare le librerie a meno che non sia necessario, ho effettuato l'upgrade per compensare il downvote: P
froggomad

3

provare

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

o soluzione regexp

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


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

Questo sarebbe più lento, ma si occuperà dell'aggiunta di spazio prima e dopo un Inoltre, dovrai cambiare il valore della posizione (a 2, ora è più intuitivo)


2

Soluzione rapida! Se non vuoi aggiungere manualmente uno spazio, puoi farlo:

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

(modifica: vedo che in realtà si trova una risposta sopra, scusa!)


2

Se è disponibile il lookbehind di ES2018 , un'altra soluzione regexp, che la utilizza per "sostituire" in una posizione di larghezza zero dopo l'ennesimo carattere (simile a quella di @Kamil Kiełczewski, ma senza memorizzare i caratteri iniziali in un gruppo di acquisizione):

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


1

Beh, solo un piccolo cambiamento perche 'le soluzioni della soluzione sopra riportate

"Voglio una mela"

invece di

"Voglio una mela"

Per ottenere l'output come

"Voglio una mela"

usa il seguente codice modificato

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

13
sì, probabilmente non è desiderabile in questo caso, ma l'aggiunta automatica di uno spazio aggiuntivo non è quasi sicuramente desiderabile in tutti i casi.
Nickf

12
Le soluzioni corrette non sarebbero quelle di aggiungere gli spazi nella stringa = 'an', in questo modo puoi riutilizzare la funzione
Tosh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.