Eu tenho uma string:
const str = 'a string, a long string'
Quero dividi-lo em palavras (não há problema aqui) e depois rastrear o índice de cada palavra na string original.
Resultado atual:
[
{ word: 'a', idx: 0 },
{ word: 'string', idx: 2 },
{ word: 'a', idx: 0 },
{ word: 'long', idx: 12 },
{ word: 'string', idx: 2 }
]
Resultado desejado:
[
{ word: 'a', idx: 0 },
{ word: 'string', idx: 2 },
{ word: 'a', idx: 10 },
{ word: 'long', idx: 12 },
{ word: 'string', idx: 17 }
]
Código até agora:
const str = 'a string, a long string'
const segmenter = new Intl.Segmenter([], { granularity: 'word' })
const getWords = str => {
const segments = segmenter.segment(str)
return [...segments]
.filter(s => s.isWordLike)
.map(s => s.segment)
}
const words = getWords(str)
const result = words.map(word => ({
word,
idx: str.indexOf(word)
}))
console.log(result)
Os objetos sobre os quais você está iterando, que contêm e
segment
se it ou nãoisWordLike
, também têmindex
:Aqui está a definição do tipo :
Talvez uma ideia para
String.matchAll
recuperar palavras e índices.Ou apenas reduza o
Intl.Segmenter.segment
resultado.Algo como:
Você poderia tentar um regex, é 25x mais rápido que um segmentador:
Decompus sua string em uma matriz de objetos contendo a palavra e o índice da palavra.
Se você quiser a pontuação como uma palavra, poderá usar um regex.