使用Lodash查找数组元素索引并分组关键词索引存储为对象
我来帮你搞定这个需求!用Lodash实现关键词分组、保留索引,再加上文本高亮和内容分类完全没问题,咱们一步步来:
需求拆解
先明确咱们要实现的核心功能:
- 从目标文本中定位指定关键词的所有出现位置(起始索引)
- 按关键词分组,将每个关键词对应的索引列表存储为对象属性
- 对原文本做关键词高亮标记
- 把最终结果分类整理成结构化对象
完整实现代码
下面是基于Lodash的完整解决方案,包含注释说明:
// 原始输入文本 const text = "Lorem ipsum dolor sit bar, consectetur adipiscing bazz. Nam luctus fringilla bazz. Suspendisse mauris far, aliquam in far nec, placerat quis leo. fuzz fuzz"; // 要查找的关键词列表 const keywords = ['bar', 'bazz', 'far', 'fuzz']; // 1. 用Lodash实现关键词-索引分组 const keywordIndexMap = _.reduce(keywords, (result, keyword) => { // 转义关键词中的正则特殊字符,避免匹配出错 const safeKeyword = _.escapeRegExp(keyword); // 用边界符\b确保匹配完整单词(如需匹配子串可去掉\b) const regex = new RegExp(`\\b${safeKeyword}\\b`, 'g'); const indices = []; // 遍历所有匹配结果,收集起始索引 let match; while ((match = regex.exec(text)) !== null) { indices.push(match.index); // 处理重叠匹配场景(比如关键词是"aa",文本是"aaa"),不需要可删除此行 regex.lastIndex = match.index + 1; } // 仅保留有匹配结果的关键词 if (indices.length > 0) { result[keyword] = indices; } return result; }, {}); // 2. 实现文本关键词高亮(这里用<mark>标签,可根据需求替换) const highlightedText = _.reduce(keywords, (processedText, keyword) => { const safeKeyword = _.escapeRegExp(keyword); // gi修饰符表示全局匹配+忽略大小写(如需严格大小写可去掉i) const regex = new RegExp(`\\b${safeKeyword}\\b`, 'gi'); // 用$&指代匹配到的关键词,包裹高亮标签 return _.replace(processedText, regex, '<mark>$&</mark>'); }, text); // 3. 分类整理最终结果 const finalResult = { category: '文本关键词分析结果', keywordGrouping: keywordIndexMap, highlightedContent: highlightedText }; // 输出结果 console.log(finalResult);
输出示例
运行上述代码后,你会得到如下结构化结果:
{ category: '文本关键词分析结果', keywordGrouping: { bar: [18], bazz: [46, 78], far: [106, 123], fuzz: [163, 169] }, highlightedContent: "Lorem ipsum dolor sit <mark>bar</mark>, consectetur adipiscing <mark>bazz</mark>. Nam luctus fringilla <mark>bazz</mark>. Suspendisse mauris <mark>far</mark>, aliquam in <mark>far</mark> nec, placerat quis leo. <mark>fuzz</mark> <mark>fuzz</mark>" }
自定义调整说明
- 如果需要匹配子字符串而非完整单词:删除正则表达式中的
\\b边界符即可 - 如果需要严格区分大小写:去掉正则修饰符中的
i - 如果不需要处理重叠匹配:删除
regex.lastIndex = match.index + 1这一行 - 高亮样式可自定义:把
<mark>$&</mark>替换成你需要的标记(比如<span class="highlight">$&</span>)
内容的提问来源于stack exchange,提问作者Joey Hipolito
相关产品推荐
相关产品推荐

