You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 07:37:21