2013-02-14 14 views
26

voglio sostituire il testo tra due indici in Javascript, qualcosa come:Come sostituire una stringa tra i due indici

str = "The Hello World Code!"; 
str.replaceBetween(4,9,"Hi"); 
// outputs "The Hi World Code" 

Gli indici e la stringa sono entrambi dinamici.

Come potrei andare a fare questo?

risposta

51

Non esiste alcun metodo in JavaScript. Ma si può sempre creare la propria:

String.prototype.replaceBetween = function(start, end, what) { 
    return this.substring(0, start) + what + this.substring(end); 
}; 

"The Hello World Code!".replaceBetween(4, 9, "Hi"); 
// >> "The Hi World Code!" 
+5

Qual è il motivo per il collegamento di questa funzione di utilità al prototipo .. – Exception

+0

+1, mi ha richiesto più tempo per capire più o meno la stessa cosa! – adeneo

+1

@Exception OTOH, la possibilità di collisione nello spazio dei nomi è trascurabile con questo nome di metodo ;-) –

5

C'è un metodo Array.splice in JavaScript che fa questo lavoro, ma non String.splice. Se si converte la stringa in un array, però:

var str = "The Hello World Code!"; 
var arr = str.split(''); 
var removed = arr.splice(4,5,"Hi"); // arr is modified 
str = arr.join(''); 
+3

Si noti che mentre è possibile chiamare 'Array.splice' su una stringa, non agirà come desiderato perché le stringhe sono immutabili. –

+0

Non sta usando 'splice' su una stringa. Sta creando un nuovo array contenente tutti i singoli personaggi chiamando 'split ('')', quindi facendo affidamento sugli effetti collaterali dell'uso 'splice' su quell'array (rimuovendo i caratteri dall'array), e infine ricucendolo insieme in una nuova stringa chiamando 'join ('')'. Direi che questa è una risposta molto intuitiva per le persone che hanno familiarità con i metodi usati. Ma non è il più breve o il più efficiente. –

+1

Capisco che questo post è da tempo. Attualmente 'split' e' join' non funzionano bene con molte emoji (come ad esempio) – Green

0

Un altro approccio quando è necessario sostituire completamente una stringa in un indice specifico, con esattamente la stessa chiamata di funzione con String.prototype.replace potrebbe essere questo:

String.prototype.replaceAt = function(index, fromString, toString) { 
    let hasWrongParams = typeof index !== 'number' 
       || !fromString || typeof fromString !== 'string' 
       || !toString || typeof toString !== 'string'; 
    if(hasWrongParams) return ''; 
    let fromIndex = index; 
    let toIndex = index + fromString.length; 
    return this.substr(0, fromIndex) + toString + this.substr(toIndex); 
} 

https://gist.github.com/kwnccc/9df8554474e39f4b17a07efbbdf7971c

Ad esempio:

let string = 'This is amazing world, it's still amazing!'; 
string.replaceAt(8, 'amazing', 'worderful'); 
// 'This is worderful world, it's still amazing!' 
string.replaceAt(34, 'amazing', 'worderful'); 
// 'This is amazing world, it's still worderful!' 
0

Ecco come ha funzionato per me.

var str = "The Hello World Code!"; 
var newStr="Hi" 

var startIndex= 4; // start index of 'H' from 'Hello' 
var endIndex= 8; // end index of 'o' from 'Hello' 
var preStr = str.substring(0, startIndex); 
var postStr = str.substring(endIndex+1, str.length - 1); 
var result = preStr+newStr+postStr;);  // outputs "The Hi World Code" 

violino: http://jsfiddle.net/ujvus6po/1/

Problemi correlati