de mi código a continuación, la constante myText almacena una cadena que tiene variables dinámicas en la forma {{nombre}}, {{edad}}, estoy tratando de usar expresiones regulares para encontrar esas variables dinámicas para reemplazarlas con valores reales. Tengo una matriz que almacena la variable esperada y su valor correspondiente. Necesito recorrer la matriz y buscar la matriz[elemento].variable de la cadena myText, y luego reemplazar todas las variables encontradas, con la matriz[elemento].valor correspondiente. Todavía no soy bueno en arreglos, y todo lo que sabía era el mapa, foreach, funciones, pero estos no me están dando los resultados.
const text = ' hello {{name}}, you have made {{age}} now, and you are a {{gender}}' const expects = [ { expected: /{{name}}/, wanted: "Mary" }, { expected: /{{age}}/, wanted: 30 }, { expected: /{{gender}}/, wanted: "girl" }, ]; const result = expects.map(item => { return ( text.replace( item.expected, item.wanted ) ) })usando la función de mapa, obtengo esto como un registro de consola
['<p>hello Mary, you have made {{age}} and you are now a {{gender}}</p>', '<p>hello {{name}}, you have made 30 and you are now {{gender}}</p>', '<p>hello {{name}}, you have made {{age}} and and you are now a girl</p>']Esperaba
hello Mary, you have made 30 and you are now a girlamablemente ayuda
Esta puede ser una posible solución para lograr el objetivo deseado.
Fragmento de código
const text = ' hello {{name}}, you have made {{age}} now, and you are a {{gender}}' const expects = [ { expected: /{{name}}/, wanted: "Mary" }, { expected: /{{age}}/, wanted: 30 }, { expected: /{{gender}}/, wanted: "girl" }, ]; console.log( expects.reduce( (acc, {expected, wanted}) => (acc.replace(expected, wanted)), text ) );Explicación
expects usando .reduce()acc como el acumulador/agregador y configúrelo en text inicialmenteexpected y wanted.replace() en el acumulador para efectuar los cambios/reemplazos deseadosexpects el objeto esperado en una sola expresión regular, y luego necesita llamar a replace solo una vez:
const expects = [ { expected: /{{name}}/, wanted: "Mary" }, { expected: /{{age}}/, wanted: 30 }, { expected: /{{gender}}/, wanted: "girl" }, ]; // Prepare const regex = RegExp(expects.map(({expected}) => expected.source).join('|'), "g"); const trans = Object.fromEntries(expects.map(({expected, wanted}) => [expected.source, wanted])); // Example const text = ' hello {{name}}, you have made {{age}} now, and you are a {{gender}}' const result = text.replace(regex, m => trans[m]); console.log(result); Alternativamente, si se pretende que todas las "variables" estén codificadas como {{ }} , entonces podría buscar ese patrón genérico y realizar la búsqueda:
const expects = [ { expected: /{{name}}/, wanted: "Mary" }, { expected: /{{age}}/, wanted: 30 }, { expected: /{{gender}}/, wanted: "girl" }, ]; // Prepare const trans = Object.fromEntries(expects.map(({expected, wanted}) => [expected.source, wanted])); // Example const text = ' hello {{name}}, you have made {{age}} now, and you are a {{gender}}' const result = text.replace(/{{.*?}}/g, m => trans[m] ?? m); console.log(result);