JavaScript if/else语句中||逻辑或运算符失效问题排查
问题背景
编写过滤函数筛选电子表格内的特定编码时,因待匹配编码列表较长(约50个),堆叠大量else if分支会导致Google表格脚本环境运行异常、函数执行失败。
可正常运行的多分支写法示例:
var bldgFilter = function(item) { if(item[1] == "TA12") { return true; } else if (item[1] == "DA06") { return true; } else { return false; } }
尝试使用||逻辑或运算符简化判断后代码无法正常工作,不清楚语法错误,简化后的错误写法:
var bldgFilter = function(item) { if(item[1] == "TA12" || "DA06") { return true; } else { return false; } }
需求为从如下二维数组中,过滤出第二个位置元素为指定编码的一维数组:
const rawData = [[123730, "PH02", 1245, 1745, 1630, 1.0], [122857, "PH01", 1300, 1800, 2145, 1.0], [125116, "TA12", 1300, 1800, 1830, 1.0], [122077, "DA04", 1330, 1830, 2230, 1.0], [124376, "VP02", 1400, 1900, 2300, 1.0], [119588, "SC03A", 1430, 1930, 2230, 1.0], [122248, "MP01", 1430, 1930, 2330, 1.0], [124551, "VG02", 1630, 2130, 1900, 1.0], [125130, "DA06", 1630, 2130, "0230", 2.0], [122979, "SY01", 1700, 2200, 2300, 1.0], [123437, "PH01", 1730, 2230, "0300", 1.0], [124137, "BA06", 1730, 2230, "0130", 1.0], [124953, "BA09", 1730, 2230, "0300", 3.0]]
错误原因
||运算符会分别计算两侧表达式的布尔值,错误写法中||右侧是字符串"DA06",属于非空字符串,在JS中会被永远判定为true,导致整个判断条件永远成立,所有数组条目都会被匹配,完全失去过滤效果。
如果要使用||实现正确判断,必须为每个编码写完整的判断逻辑,示例:
// 仅2个编码时可这么写,50个编码时不推荐 var bldgFilter = function(item) { return item[1] == "TA12" || item[1] == "DA06"; }
这种写法在编码数量达到50个时,代码冗余度极高,还容易出现漏写判断条件的问题,也可能触发Google脚本分支过多的运行异常。
推荐解决方案
把所有待匹配的编码存入Set结构,后续直接判断当前条目的编码是否存在于目标集合中即可,相比多分支写法有明显优势:
- 维护成本低:新增/删除匹配编码只需要修改初始化Set的数组,不需要改动判断逻辑
- 运行性能高:Set的查询时间复杂度为O(1),编码数量增多也不会降低运行效率
- 兼容性好:完全适配Google Apps Script运行环境,不会出现多分支导致的执行失败问题
完整实现代码:
// 所有待匹配编码统一放在数组中初始化Set,新增/删除编码直接修改这个数组即可 const targetBldgCodes = new Set([ "TA12", "DA06" // 剩余48个待匹配编码直接按格式追加在此处,逗号分隔 ]); const bldgFilter = function(item) { return targetBldgCodes.has(item[1]); } // 调用过滤方法获取结果 const filteredResult = rawData.filter(bldgFilter);
针对给出的测试数据,运行后返回的正确结果为:
[ [125116, "TA12", 1300, 1800, 1830, 1.0], [125130, "DA06", 1630, 2130, "0230", 2.0] ]
内容的提问来源于stack exchange,提问作者Borgher
相关产品推荐
相关产品推荐

