¿Cómo reemplazo un carácter en un índice específico en JavaScript?

Resuelto Santhosh asked hace 15 años • 30 respuestas

Tengo una cadena, digamos Hello world, y necesito reemplazar el carácter en el índice 3. ¿Cómo puedo reemplazar un carácter especificando un índice?

var str = "hello world";

necesito algo como

str.replaceAt(0,"h");
Santhosh avatar Sep 16 '09 12:09 Santhosh
Aceptado

En JavaScript, las cadenas son inmutables , lo que significa que lo mejor que puedes hacer es crear una nueva cadena con el contenido modificado y asignar la variable para que apunte a ella.

Deberá definir la replaceAt()función usted mismo:

String.prototype.replaceAt = function(index, replacement) {
    return this.substring(0, index) + replacement + this.substring(index + replacement.length);
}

Y úsalo así:

var hello = "Hello World";
alert(hello.replaceAt(2, "!!")); // He!!o World
Cem Kalyoncu avatar Sep 16 '2009 05:09 Cem Kalyoncu

No hay ninguna replaceAtfunción en JavaScript. Puede utilizar el siguiente código para reemplazar cualquier carácter en cualquier cadena en la posición especificada:

function rep() {
    var str = 'Hello World';
    str = setCharAt(str,4,'a');
    alert(str);
}

function setCharAt(str,index,chr) {
    if(index > str.length-1) return str;
    return str.substring(0,index) + chr + str.substring(index+1);
}
<button onclick="rep();">click</button>
Expandir fragmento

rahul avatar Sep 16 '2009 05:09 rahul

No puedes. Tome los caracteres antes y después de la posición y concatenelos en una nueva cadena:

var s = "Hello world";
var index = 3;
s = s.substring(0, index) + 'x' + s.substring(index + 1);
Guffa avatar Sep 16 '2009 05:09 Guffa
str = str.split('');
str[3] = 'h';
str = str.join('');
colllin avatar Oct 30 '2014 02:10 colllin

Hay muchas respuestas aquí y todas se basan en dos métodos:

  • MÉTODO 1: divide la cadena usando dos subcadenas y coloca el carácter entre ellas
  • MÉTODO 2: convierta la cadena en una matriz de caracteres, reemplace un miembro de la matriz y únalo

Personalmente, usaría estos dos métodos en diferentes casos. Dejame explicar.

@FabioPhms: Su método fue el que usé inicialmente y tenía miedo de que fuera malo en cadenas con muchos caracteres. Sin embargo, la pregunta es ¿qué hay tantos personajes? Lo probé en 10 párrafos de "lorem ipsum" y me llevó unos milisegundos. Luego lo probé con una cuerda 10 veces más grande y realmente no hubo gran diferencia. Mmm.

@vsync, @Cory Mawhorter: Sus comentarios no son ambiguos; sin embargo, nuevamente, ¿qué es una cadena grande? Estoy de acuerdo en que para 32...100 kb el rendimiento debería ser mejor y se debería usar substring-variant para esta operación de reemplazo de caracteres.

Pero ¿qué pasará si tengo que hacer bastantes sustituciones?

Necesitaba realizar mis propias pruebas para demostrar qué es más rápido en ese caso. Digamos que tenemos un algoritmo que manipulará una cadena relativamente corta que consta de 1000 caracteres. Esperamos que, en promedio, cada carácter de esa cadena se reemplace aproximadamente 100 veces. Entonces, el código para probar algo como esto es:

var str = "... {A LARGE STRING HERE} ...";

for(var i=0; i<100000; i++)
{
  var n = '' + Math.floor(Math.random() * 10);
  var p = Math.floor(Math.random() * 1000);
  // replace character *n* on position *p*
}

Creé un violín para esto y está aquí . Hay dos pruebas, TEST1 (subcadena) y TEST2 (conversión de matriz).

Resultados:

  • PRUEBA1: 195 ms
  • PRUEBA2: 6 ms

¡Parece que la conversión de matrices supera a las subcadenas en 2 órdenes de magnitud! Entonces, ¿qué diablos pasó aquí?

Lo que realmente sucede es que todas las operaciones en TEST2 se realizan en la propia matriz, utilizando expresiones de asignación como strarr2[p] = n. La asignación es realmente rápida en comparación con la subcadena en una cadena grande y está claro que va a ganar.

Por tanto, se trata de elegir la herramienta adecuada para el trabajo. De nuevo.

OzrenTkalcecKrznaric avatar Jul 19 '2013 13:07 OzrenTkalcecKrznaric