Tengo un texto y una matriz de bloques que tienen un objeto que representa el desplazamiento del desplazamiento inicial y final de la cadena. Quiero hacer un bloque único a partir de esto y agregarlo en función del desplazamiento más grande. una muestra está abajo.
let text = "announcing improvements to the GitHub Actions “New Workflow” experience. Now, when you want to create"; let blocks = [ { word: "GitHub", start: "31", end: "37", }, { word: "Now", start: "73", end: "76", }, { word: "GitHub Actions", start: "31", end: "45", }, { word: "the GitHub Actions “New Workflow” experience.", start: "27", end: "72", }, ];en el ejemplo anterior "la experiencia de "Nuevo flujo de trabajo" de GitHub Actions". es la palabra más grande que tiene "GitHub" y "Acciones de GitHub" como subconjunto, por lo que en el conjunto de desplazamiento final de inicio será con el más grande y los otros dos serán parte de la división
Rendimiento esperado
let finalSplit = [ { start: "73", end: "76", splits: [ { word: "Now", start: "73", end: "76", }, ], }, { start: "27", end: "72", splits: [ { word: "GitHub Actions", start: "31", end: "45", }, { word: "the GitHub Actions “New Workflow” experience.", start: "27", end: "72", }, { word: "GitHub", start: "31", end: "37", }, ], }, ];Puede utilizar la agrupación por enfoque hash:
const blocks = [{word: "GitHub", start: "31", end: "37"},{word: "Now", start: "73", end: "76"},{word: "GitHub Actions", start: "31", end: "45"},{word: "the GitHub Actions “New Workflow” experience.", start: "27", end: "72"}]; const reduced = blocks.reduce((acc, block) => { const [{ start, end }] = blocks .filter((s) => (s.start <= block.start) && (s.end >= block.end)) .sort((s1, s2) => (s2.end - s2.start) - (s1.end - s1.start)); const hash = `${start}-${end}`; acc[hash] = acc[hash] ? { ...acc[hash], splits: [...acc[hash].splits, block] } : { start, end, splits: [block] }; return acc; }, {}); const result = Object.values(reduced); console.log(result) .as-console-wrapper { max-height: 100% !important; top: 0; }