Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

266
Vistas
Resaltado de varias líneas en el texto desde el índice inicial hasta el índice final (resaltado de rango)

Tengo un texto largo y una matriz que contiene algunos objetos. cada objeto tiene una clave de inicio y una clave de finalización. Lo que estoy tratando de hacer es resaltar el texto, solo en los índices que obtengo de la matriz.

Escribí este código:

 function HighlightRange(text: any, start: any, end: any, color: any) { return ( text.substring(0, start) + `<span style="background-color: ${color}">` + text.substring(start, end) + `</span>` + text.substring(end) ); }

Funciona perfectamente si solo tengo un objeto en la matriz. La cuestión es que cuando lo uso, cambia el texto y ahora tiene una longitud mayor y el resaltado ahora necesita obtener la nueva longitud para resaltar el rango exacto.

Intenté eso:

 value?.input_spans.map((value: any, key: any) => { newString = HighlightRange( originalTextArea, value.start, value.end, "lightgreen" ); });

¿Es posible iterar sobre todos los objetos y resaltar todo el texto de principio a fin sin cambiar la longitud del texto?

about 4 years ago · Juan Pablo Isaza
2 Respuestas
Responde la pregunta

0

Este es uno de los raros casos de uso de .reduceRight() . Como menciona @Robert Sabitz, comenzar desde el final de la cadena mantendría sus índices de interés sin cambios.

 var prg = document.getElementById("lorem"), btn = document.getElementById("btn"), ixs = [{start:28, end:39}, {start:101, end:111}], clr = "lightgreen"; function highlighter(str,ixs,color){ return ixs.reduceRight( (s,ix) => `${s.slice(0, ix.start)}<span style="background-color:${color}">${s.slice(ix.start,ix.end)}</span>${s.slice(ix.end)}` , str ); } btn.addEventListener("click", _ => prg.innerHTML = highlighter(prg.textContent,ixs,clr));
 <p id="lorem">Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus tincidunt dictum sapien, sit amet vestibulum ex tempus eget. Ut vitae.</p> <button id="btn">Highlight</button>

about 4 years ago · Juan Pablo Isaza Denunciar

0

Simplemente itere desde el final de los elementos para resaltar (similar a eliminar elementos de la matriz sin actualizar el índice). De esta manera, los índices desde el principio se mantendrán correctos.

El problema aquí surge con el resaltado anidado/superpuesto. Si ese es tu caso, entonces hay que hacerlo uno por uno.

Ejemplo

 const spansToHighlight = value?.input_spans if (!spansToHighlight) { return } let highlightedText = originalTextArea for (let i = spansToHighlight.length - 1; i >= 0; i++) { highlightedText = HighlightRange( highlightedText , value.start, value.end, "lightgreen" ); }
about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda