如何比较两行列表并将匹配行替换为第三列表对应行?
解决列表整行匹配替换问题
需求说明
需要对比LISTE_PROJ和INFOS_PROJETS两个二维列表,当LISTE_PROJ中的某一行与INFOS_PROJETS中的某一行完全匹配时,将LISTE_PROJ中的该行替换为INFOS_PROJETSPOURCENTS中对应位置的行。
示例数据
// 原始列表 var LISTE_PROJ = [ ['Scénographie', true, true, true, true, true], ['Plan tactile', false, false, false, false, true], ['Maquette tactile bâtiment', false, false, false, false, true], ['Maquette tactile bâtiment', false, false, false, false, false] ]; // 匹配参照列表 var INFOS_PROJETS = [ ['Plan tactile', false, false, false, false, true], ['Maquette tactile bâtiment', false, false, false, false, true] ]; // 替换用列表(与INFOS_PROJETS行一一对应) var INFOS_PROJETSPOURCENTS = [ [0.15,'NONE', 0.35,'NONE', 0.4, 0.1], [0.15,'NONE', 0.35,'NONE', 0.5,'NONE'] ];
期望输出
var NEW_LISTE_PROJ = [ ['Scénographie', true, true, true, true, true], [0.15,'NONE', 0.35,'NONE', 0.4, 0.1], [0.15,'NONE', 0.35,'NONE', 0.5,'NONE'], ['Maquette tactile bâtiment', false, false, false, false, false] ];
现有问题
- 仅能比较行的第一列,无法实现整行完全匹配;
- 日志输出次数不符合预期(出现6次"OK");
- 未将结果存入
NEW_LISTE_PROJ变量供后续使用。
解决方案代码
function REPART() { var LISTE_PROJ = [ ['Scénographie', true, true, true, true, true], ['Plan tactile', false, false, false, false, true], ['Maquette tactile bâtiment', false, false, false, false, true], ['Maquette tactile bâtiment', false, false, false, false, false] ]; var INFOS_PROJETS = [ ['Plan tactile', false, false, false, false, true], ['Maquette tactile bâtiment', false, false, false, false, true] ]; var INFOS_PROJETSPOURCENTS = [ [0.15,'NONE', 0.35,'NONE', 0.4, 0.1], [0.15,'NONE', 0.35,'NONE', 0.5,'NONE'] ]; // 辅助函数:判断两个行数组是否完全匹配 function rowsMatch(row1, row2) { if (row1.length !== row2.length) return false; for (var i = 0; i < row1.length; i++) { if (row1[i] !== row2[i]) return false; } return true; } var NEW_LISTE_PROJ = []; // 遍历原始列表的每一行 for (var i = 0; i < LISTE_PROJ.length; i++) { var currentRow = LISTE_PROJ[i]; var matched = false; // 遍历参照列表找匹配项 for (var j = 0; j < INFOS_PROJETS.length; j++) { if (rowsMatch(currentRow, INFOS_PROJETS[j])) { // 找到匹配,替换为对应百分比行 NEW_LISTE_PROJ.push(INFOS_PROJETSPOURCENTS[j]); Logger.log("OK - 行" + i + "匹配成功"); matched = true; break; // 找到匹配就跳出内层循环,避免重复匹配 } } // 没有找到匹配,保留原行 if (!matched) { NEW_LISTE_PROJ.push(currentRow); } } // 输出结果到日志,也可直接返回NEW_LISTE_PROJ供后续使用 Logger.log(NEW_LISTE_PROJ); return NEW_LISTE_PROJ; }
问题解决说明
- 整行匹配实现:新增
rowsMatch辅助函数,先判断两行长度是否一致,再逐元素对比,确保整行内容完全相同才判定匹配,避免了toString()方法可能因元素含特殊字符导致的误判。 - 日志输出优化:仅在找到匹配行时输出一次"OK",且通过
break跳出内层循环,避免同一行多次匹配重复输出。 - 结果存入变量:创建
NEW_LISTE_PROJ数组,遍历过程中按规则添加替换后的行或原行,最终可直接使用该变量,也可通过return返回供其他函数调用。
内容的提问来源于stack exchange,提问作者emilianoSala
相关产品推荐
相关产品推荐

