如何拆分字符串为单词并正确追踪每个单词在原字符串中的起始索引?
如何拆分字符串为单词并正确追踪每个单词在原字符串中的起始索引?
嘿,我看你遇到的问题是重复单词的索引没取对对吧?原因很简单——你用str.indexOf(word)的时候,它每次都会从字符串开头找第一个匹配的位置,所以重复的单词就会拿到第一次出现的索引,自然不符合预期啦。
其实你用的Intl.Segmenter已经帮你把每个单词的起始索引准备好了!它返回的每个segment对象里本身就有index属性,直接用这个就完事了,根本不用再额外去查。
来看看修正后的代码:
const str = 'a string, a long string' const segmenter = new Intl.Segmenter([], { granularity: 'word' }) const getWordsWithIndices = str => { const segments = segmenter.segment(str) return [...segments] .filter(s => s.isWordLike) .map(s => ({ word: s.segment, idx: s.index // 直接用segment自带的index属性 })) } const result = getWordsWithIndices(str) console.log(result)
运行这段代码后,你就能得到想要的结果:
[ { word: 'a', idx: 0 }, { word: 'string', idx: 2 }, { word: 'a', idx: 10 }, { word: 'long', idx: 12 }, { word: 'string', idx: 17 } ]
为什么这样管用?因为Intl.Segmenter的segment方法返回的每个片段对象,都包含了该片段在原字符串中的起始位置index,以及片段内容segment、是否为单词的标识isWordLike,我们只需要在过滤出单词后,把这些信息直接组装成对象就行,完全不需要再用indexOf去做多余的查找,还避免了重复单词的索引错误问题。
备注:内容来源于stack exchange,提问作者danday74
相关产品推荐
相关产品推荐

