Suitescript 2.0数组数值自动加.0后缀 索引匹配异常如何解决
SuiteScript 2.0 数值ID匹配问题解决方案
根因说明
- SuiteScript 2.0服务端运行在ES5.1兼容的Rhino引擎上,不支持ES6+新增的
Math.trunc、Array.includes等API,所以调用这两个方法会报错 - NetSuite中数字类型字段默认返回浮点值,整数也会显示为带
.0的格式,indexOf是严格相等匹配,如果待匹配的ID是字符串类型、或者整型和浮点型的隐式转换异常,就会出现匹配失败的问题
修复方案
方案1:统一转换为整数后匹配
用ES5原生支持的parseInt替代Math.trunc做取整处理,代码示例:
// 预处理数组,把所有元素转为整数 var intStatusArray = interfaceStatusArray1.map(function (num) { return parseInt(num, 10); }); // 待匹配ID也转成整数 var targetId = parseInt(lineItemFieldValues.interfaceStatusID, 10); // 执行匹配判断 if (intStatusArray.indexOf(targetId) === -1) { // 此处写ID不匹配时的逻辑 }
如果对性能有要求,也可以用位运算做取整(仅适用于32位以内整数,ID场景完全满足):
// 位运算取整替代parseInt return num | 0;
方案2:统一转换为字符串匹配
如果担心数值转换导致的异常,也可以全部转成字符串做匹配:
var strStatusArray = interfaceStatusArray1.map(function (num) { return num.toString(); }); var targetId = lineItemFieldValues.interfaceStatusID.toString(); if (strStatusArray.indexOf(targetId) === -1) { // 此处写ID不匹配时的逻辑 }
方案3:直接循环判断(无需预处理数组)
如果不想修改原数组,也可以直接遍历做匹配校验:
var isIdMatched = false; var targetId = parseInt(lineItemFieldValues.interfaceStatusID, 10); for (var i = 0; i < interfaceStatusArray1.length; i++) { if (parseInt(interfaceStatusArray1[i], 10) === targetId) { isIdMatched = true; break; } } if (!isIdMatched) { // 此处写ID不匹配时的逻辑 }
内容的提问来源于stack exchange,提问作者Nuri Ensing
相关产品推荐
相关产品推荐

