为什么Google Apps Script数组去重时循环内的if判断语句不执行?
重复值判断分支不触发问题排查
我始终无法理解为什么写的if判断语句完全不执行。未加调试日志的正常版本判断逻辑本是直接写为if(answerArray[z] == answerArray[z-1]),按逻辑第三次循环时就应该命中该分支,实际运行时分支完全没有触发,换成严格相等判断===也没有效果。
调试版代码
为了定位问题加了大量Logger日志,调试版代码如下:
///////////////////////////////////////////////////////////////////////// // 获取选项值 ///////////////////////////////////////////////////////////////////////// var lastRow = sheet.getLastRow(); var rawArray= sheet.getRange('D6:D'+lastRow).getValues(); var answerArray = rawArray.filter(function(n){return n != ''}); // 移除空值 answerArray.sort(); ///////////////////////////////////////////////////////////////////////// // 移除重复选项 ///////////////////////////////////////////////////////////////////////// var arrayContents = ""; for (var z = 0;z<answerArray.length;z=z+1) {arrayContents = arrayContents + answerArray[z] + ", ";} Logger.log("RemoveDupes Started"); Logger.log("Array Contents: " + arrayContents); Logger.log("answerArray[0] = "+answerArray[0]); for(var z = 1; z< answerArray.length; z=z+1){ var current = answerArray[z]; var previous = answerArray[z-1]; Logger.log("Current = " + current+"; Previous = " + previous); if(current == previous) { Logger.log("Duplicate Found"); answerArray.splice(z,1); z=z-1; // 数组长度缩短后回退索引,避免漏判相邻重复值 } } Logger.log("RemoveDupes Ended");
实际运行日志
11:40:53 AM Notice Execution started 11:41:01 AM Info RemoveDupes Started 11:41:01 AM Info Array Contents: A, B, C, C, D, 11:41:01 AM Info answerArray[0] = A 11:41:01 AM Info Current = B; Previous = A 11:41:01 AM Info Current = C; Previous = B 11:41:01 AM Info Current = C; Previous = C 11:41:01 AM Info Current = D; Previous = C 11:41:01 AM Info RemoveDupes Ended
问题核心:日志打印时明明显示当前值、上一个值都是C,但相等判断始终不成立。
问题根因
从Google SheetsgetValues()接口返回的单元格值并非纯字符串,而是附带表格元数据的封装对象。这类对象在拼接字符串、日志输出时会自动调用toString()方法,把展示文本打印为C,但两个对象本身的引用、内部结构完全不一致,因此无论用==还是===都无法判定二者相等。
最终解决方案
把数组元素强制转换为纯字符串,剥离接口返回值附带的元数据后,判断逻辑即可正常运行。修改后的代码如下:
///////////////////////////////////////////////////////////////////////// // 获取选项值 ///////////////////////////////////////////////////////////////////////// var lastRow = sheet.getLastRow(); var rawArray = [""]; var directInputArray = sheet.getRange('D6:D'+lastRow).getValues(); for(var z = 0; z< directInputArray.length; z=z+1){ rawArray[z] = String(directInputArray[z]); // 所有值强制转为纯字符串,移除附带元数据 } var answerArray = rawArray.filter(function(n){return n != ''}); // 移除空值 answerArray.sort(); ///////////////////////////////////////////////////////////////////////// // 移除重复选项 ///////////////////////////////////////////////////////////////////////// for(var z = 1; z< answerArray.length; z=z+1){ if(answerArray[z] == answerArray[z-1]) { answerArray.splice(z,1); z=z-1; // 数组长度缩短后回退索引,避免漏判相邻重复值 } }
内容的提问来源于stack exchange,提问作者DLove
相关产品推荐
相关产品推荐

