Estoy tratando de recorrer una matriz de cadenas y para cada elemento (cadena) en esa matriz, cambie el carácter después del carácter de subrayado "_" a un carácter "*". Las cadenas son inmutables, por lo tanto, empujando todo esto a una nueva matriz.
La cadena funciona como se esperaba cuando se dirige directamente al guión bajo para el reemplazo:
const t1 = ['underscore_case', 'first_name', 'some_variable', 'calculate_age', 'delayed_departure'] const t2 = t1.map(e => e.replace(e[e.indexOf('_')], '*')) // Output: ['underscore*case', 'first*name', 'some*variable', 'calculate*age', 'delayed*departure']Pero en el momento en que se persigue la función real prevista, la de modificar el carácter que sigue al guión bajo, la salida se vuelve casi frenética, con "*" apareciendo a intervalos aleatorios a lo largo de cada cadena. En ambos el siguiente intento:
const t1 = ['underscore_case', 'first_name', 'some_variable', 'calculate_age', 'delayed_departure'] const t2 = t1.map(e => e.replace(e[e.indexOf('_')+1], '*')) // Output: ['unders*ore_case', 'first_*ame', 'some_*ariable', 'c*lculate_age', '*elayed_departure']Además, después de un poco de desesperación, ingresando manualmente en un índice como este:
const t1 = ['underscore_case', 'first_name', 'some_variable', 'calculate_age', 'delayed_departure'] const t2 = t1.map(e => e.replace(e[5], '*')) // Output: ['under*core_case', 'first*name', 'some_*ariable', 'ca*culate_age', 'd*layed_departure']La experimentación ha demostrado que, por alguna razón, el comportamiento inesperado, especialmente en los dos últimos elementos, solo tiende a surgir cuando el valor del índice especificado manualmente excede o es igual a 5 por alguna razón.
¿Por qué está pasando esto?
Después de algunas horas de probar varios enfoques de bucle y dividir cada operación fuera del encadenamiento, sigo volviendo al mismo resultado cuando uso el método de reemplazo, donde sea que ocurra, y he tenido que usar una solución alternativa que involucra el método de corte y los literales de plantilla.
El carácter que sigue al guión bajo también puede aparecer antes en la cadena, y cuando ese sea el caso, la llamada de replace encontrará esa ocurrencia y la reemplazará.
Entonces, por ejemplo, con "calculate_age", e[indexOf("_")+1] se evaluará como "a" (de "age"), pero replace encontrará una "a" al comienzo de la cadena y reemplazará el que tiene un asterisco.
En su lugar, utilice una expresión regular para esto:
const t1 = ['underscore_case', 'first_name', 'some_variable', 'calculate_age', 'delayed_departure']; const t2 = t1.map(e => e.replace(/_./g, '_*')); console.log(t2);El punto en la expresión regular es un comodín. Entonces, sea lo que sea (excepto la nueva línea), será reemplazado (junto con el guión bajo) con "_*".
En cuanto a lo que escribiste:
Las cadenas son inmutables, por lo tanto, empujando todo esto a una nueva matriz.
Sí, las cadenas son inmutables, pero las matrices son mutables, por lo que podría haber decidido reemplazar todas las cadenas en esa matriz con los reemplazos. Luego mutas la matriz, no las cadenas.
Habiendo dicho eso, está bien (y es una buena programación funcional) crear una nueva matriz.