Tengo una cadena y una matriz de índices de inicio y finalización en la cadena que deben reemplazarse con algún otro contenido. Por ejemplo, la cadena de entrada es la siguiente:
Mention 1, Mention 3 and no more mentions.
Y la matriz de índices a reemplazar es la siguiente:
[ { start: 0, end: 8 }, { start: 11; end: 18 } ] Básicamente, esto debería dar como resultado una cadena donde la Mention 1 y la Mention 3 están envueltas en un ancla (enlace).
He encontrado algunos ejemplos como este :
String.prototype.replaceBetween = function(start, end, what) { return this.substring(0, start) + what + this.substring(end); }; console.log("The Hello World Code!".replaceBetween(4, 9, "Hi"));Sin embargo, el problema con esta implementación es que es buena solo si hay 1 solo lugar para reemplazar, en mi caso puede haber varios lugares para reemplazar. Después del primer reemplazo, los índices para el resto se cambiarán ya que la cadena ahora también contendrá .
Cualquier pista/pista sería muy apreciada.
EDITAR: Hay 2 preguntas aquí, ya que su ejemplo realmente no cubre el envoltorio.
Usando índices, como mencionas, cada reemplazo cambia la posición de todos los elementos después del reemplazo. Sin embargo, los índices de caracteres anteriores permanecerían sin cambios. Simplemente necesitaría iterarlos a la inversa.
var str = 'Mention 1, Mention 3 and no more mentions.' for (const { start, end } of positions.reverse()) { str = str.replaceBetween(start, end, 'REPLACEMENT') }Sin embargo, esto realmente no aborda la preocupación del envoltorio. Si realmente debe usar índices de matriz, lo anterior podría cambiarse para aceptar una función, por ejemplo:
String.prototype.replaceBetween = function (start, end, replacer) { const what = replacer(this.substring(start, end)); return this.substring(0, start) + what + this.substring(end); }; for (const { start, end } of positions.reverse()) { str = str.replaceBetween(start, end, (match) => `<a href="#">${match}</a>`); } Sin embargo, si la matriz de índices es solo un artefacto de la búsqueda de un patrón en particular, una solución más limpia podría aprovechar String#replace con una expresión regular y una función de reemplazo.
// the `/g` at the end means "global", so it will replace all matches const pattern = /Mention \d+/g; var str = 'Mention 1, Mention 3 and no more mentions.' str = str.replace(/Mention \d+/g, (match) => { return `<a href="#">${match}</a>`; }); Salida: '<a href="#">Mention 1</a>, <a href="#">Mention 3</a> and no more mentions.'
Debe recorrer su matriz de posición. Como eso:
const n = [ { start: 0, end: 8 }, { start: 11, end: 18 } ]; let str = 'Mention 1, Mention 3 and no more mentions.'; String.prototype.replaceBetween = function(start, end, what) { return this.substring(0, start) + what + this.substring(end); }; n.forEach(e => { console.log("The Hello World Code!".replaceBetween(e.start, e.end, "Hi")); })