如何在Google App Script中比较两个数组并补全缺失元素
在Google Apps Script中补全数组缺失项的最优方案
我明白你想要实现的目标——根据niv数组的完整类别列表,为values里每个分组(H/M/N)补全缺失的类别项,缺失项用[分组, 类别, 0.0, 0.0]填充对吧?你的初步代码嵌套循环逻辑有点绕,咱们换个更清晰高效的思路来做。
核心思路
先把现有values数据按**分组(H/M/N)+类别(FB/Bach等)**构建成一个映射表,这样后续查找数据时不用反复遍历数组;然后针对每个分组,遍历niv的所有类别,有数据就用原数据,没有就生成补全的0值项。
完整实现代码
var niv = ["FB","Bach","FPSE","FPPE","AA"]; var values = [["H", "FB", 3286.25, 509.75],["H", "Bach", 4587.5, 522.5], ["H", "FPPE", 160, 2624],["H", "AA", 334, 7454], ["M", "FB", 3803.75, 1743.25],["M", "Bach", 7856.5, 709.5], ["M", "FPPE", 799, 3785],["M", "AA", 1055, 11718,2],["N", "FB", 45, 0.0, 0.0]]; // 第一步:构建分组->类别->完整数据的映射表 var dataMap = {}; values.forEach(item => { const group = item[0]; const category = item[1]; // 初始化分组对应的对象(如果不存在的话) if (!dataMap[group]) { dataMap[group] = {}; } // 保存当前类别完整数据(保留原数组所有元素) dataMap[group][category] = [...item]; }); // 第二步:生成目标数组 var result = []; // 遍历所有存在的分组 Object.keys(dataMap).forEach(group => { // 遍历niv中的每个类别,确保每个类别都有对应项 niv.forEach(category => { if (dataMap[group][category]) { // 存在该类别数据,直接加入结果 result.push(dataMap[group][category]); } else { // 不存在,生成补全的0值项 result.push([group, category, 0.0, 0.0]); } }); }); // 输出结果,和你期望的目标数组一致 console.log(result);
方案优势
- 效率更高:用对象映射代替嵌套循环,时间复杂度从O(n*m)降到O(n+m),数据量大时性能提升明显
- 逻辑清晰:先整理数据再生成结果,避免了嵌套循环里的条件判断混乱
- 兼容性好:会保留原数据中的额外元素(比如
M, AA项的2、N, FB项的第三个0.0),完全符合你的需求 - 扩展性强:后续如果
niv类别或分组增加,代码不需要大幅修改
内容的提问来源于stack exchange,提问作者Jokerphl
相关产品推荐
相关产品推荐

