No puedo entender por qué la siguiente función funciona para algunas cadenas y no funcionó para algunas que tienen un carácter similar al primero.
const change = (str,y) => (str.toLowerCase().replace(str[y],str[y].toUpperCase())); console.log(change('London',3)); //lonDon console.log(change('Lagos',3)); //lagOs console.log(change('Germany',3)); //gerMany console.log(change('Dcoder',3)); //Dcoder console.log(change('Bobby',3)); //BobbyLa función String.prototype.replace reemplaza la primera ocurrencia cuando el primer argumento es una cadena.
Puede dividir la cadena, cambiar el índice a mayúsculas y finalmente unir los caracteres.
const change = (str, y) => { const lowercase = str.toLowerCase().split(""); lowercase[y] = str[y].toUpperCase(); return lowercase.join(""); }; console.log(change('London',3)); console.log(change('Lagos',3)); console.log(change('Germany',3)); console.log(change('Dcoder',3)); console.log(change('Bobby',3));str[3] en "Dcoder" es 'd' y en replace, el primer carácter es 'D', por lo que debe cambiar el código a esto:
const change = (str,y) => { str = str.toLowerCase() str=str.slice(0,y)+str[y].toUpperCase()+str.slice(y+1) return str}O, de una manera ligeramente abreviada:
const change = (str, n) => str.split("") .map((c,i)=>i==n?c.toUpperCase():c.toLowerCase()) .join(""); ['London','Lagos','Germany','Dcoder','Bobby'].forEach(w=>console.log(change(w,3)));