JS统计数组词汇在多维数组中的出现次数及正则问题解决
数组词汇在多维数组中的出现次数统计解决方案
原代码的核心问题
- 正则语法错误:当搜索词包含
+、*这类正则特殊字符时,直接拼接会导致正则结构失效,触发Invalid regular expression报错;另外\b仅对字母数字等单词字符生效,对带空格、特殊符号的词组匹配不准确。 - 性能崩溃:12k×20k的双重循环会产生2.4亿次迭代,加上每次循环创建新正则对象,内存占用飙升,必然导致溢出。
优化后的实现代码
利用Google Sheets内置的createTextFinderAPI,它不仅性能远高于手动循环,还能自动处理特殊字符匹配。修改后的代码如下:
function countSearchTerms() { // 替换为你的实际工作表名称 const nGramsSht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("nGrams"); const nGramFinalDataSht = SpreadsheetApp.getActiveSpreadsheet().getSheetByName("nGramFinalData"); // 提取并清洗搜索词:二维数组转一维,过滤空值 const filteredTerms = nGramsSht.getRange(6, 2, nGramsSht.getLastRow() - 5, 1) .getValues() .flat() .filter(term => term.toString().trim() !== ''); // 提取并清洗待搜索数据:二维数组转一维,过滤空值 const searchTermData = nGramFinalDataSht.getRange(1, 1, nGramFinalDataSht.getLastRow(), 1) .getValues() .flat() .filter(item => item.toString().trim() !== ''); // 创建临时工作表存储待搜索数据,用于createTextFinder查询 const tempSheet = SpreadsheetApp.getActiveSpreadsheet().insertSheet(); tempSheet.getRange(1, 1, searchTermData.length, 1).setValues(searchTermData.map(item => [item])); // 逐个统计每个搜索词的出现次数 const occurrences = filteredTerms.map(term => { const textFinder = tempSheet.createTextFinder(term.toString()) .matchEntireCell(false) // false=匹配单元格内包含该词的情况;true=仅匹配完全相同的单元格 .matchCase(false) // 根据需求设置是否区分大小写 .ignoreDiacritics(false); // 根据需求设置是否忽略变音符号 return [textFinder.findAll().length]; }); // 删除临时工作表 SpreadsheetApp.getActiveSpreadsheet().deleteSheet(tempSheet); // 将统计结果写入原表 if (occurrences.length > 0) { nGramsSht.getRange(6, 3, nGramsSht.getLastRow() - 5, 1).clearContent(); nGramsSht.getRange(6, 3, occurrences.length, 1).setValues(occurrences); } }
关键修改点说明
- 数组格式转换:用
flat()把Google Sheets返回的二维数组转成一维,简化后续处理逻辑。 - 临时表的作用:
createTextFinder只能基于工作表范围操作,所以创建临时表存储待搜索数据,统计完成后立即删除,避免污染原数据。 - 匹配规则自定义:
matchEntireCell:控制是匹配单元格内包含词,还是仅匹配完全一致的单元格。matchCase:设置是否区分大小写,根据业务需求调整。
- 性能与错误规避:
createTextFinder是Google官方优化的API,比手动循环快数倍,同时自动处理正则特殊字符,彻底解决语法错误和内存溢出问题。
内容的提问来源于stack exchange,提问作者onit
相关产品推荐
相关产品推荐

