如何在Google Apps Script中对二维数组按不同列双条件查找行号
方案推荐
因为你需要高频重复执行查询,优先推荐预构建复合键索引的方案,一次构建后每次查询时间复杂度为O(1),效率远高于逐行遍历或拆分单列校验的思路。
方案1:预构建索引(高频查询首选)
步骤1:初始化索引(仅需执行1次,数据更新时同步更新即可)
// 复合键索引,存储<姓名+ID组合, 对应行号> const rowIndexMap = new Map(); // 跳过表头行,从索引1开始遍历数据 for (let i = 1; i < PrincipalArray.length; i++) { const row = PrincipalArray[i]; // 用分隔符拼接复合键,避免不同字段内容拼接导致的键冲突 const compositeKey = `${row[0]}||${row[1]}`; rowIndexMap.set(compositeKey, i); }
步骤2:封装查询函数(每次查询直接调用,性能极高)
function getMatchRow(name, targetId) { const searchKey = `${name}||${targetId}`; return rowIndexMap.has(searchKey) ? rowIndexMap.get(searchKey) : -1; }
使用示例
console.log(getMatchRow("Elton", 6)); // 输出 3 console.log(getMatchRow("Jhon", 5)); // 输出 -1
方案2:单次遍历查询(适合数据量小、查询频率低的场景)
如果数据量少于1000行,也可以用单次遍历实现,不需要提前维护索引:
function getMatchRowOnce(name, targetId) { for (let i = 1; i < PrincipalArray.length; i++) { if (PrincipalArray[i][0] === name && PrincipalArray[i][1] === targetId) { return i; } } return -1; }
原思路优化说明
你原本拆分单列数组用indexOf定位的思路,遇到同姓名对应多行的情况时,仍需遍历所有姓名匹配行校验ID,最坏情况效率和全量遍历相当,还需要额外存储两个单列数组,复合键索引的方案更适合高频查询场景。
内容的提问来源于stack exchange,提问作者Juan
相关产品推荐
相关产品推荐

