SSJS从多值字段提取字符串子集时调用includes方法报错如何解决
问题场景
在绑定数据源文档的XPage中,设置了存储电子邮箱地址的多值字段,需求为遍历所有邮箱地址,筛选出包含mydomain域名的地址子集,作为邮件发送的收件人值。
运行脚本时抛出如下错误,即便通过typeof()检测返回值类型为字符串,调用toString()等方法也无法规避问题:
执行JavaScript计算表达式时出错
脚本解释器错误[TypeError]:Error calling method 'includes(string)' on an object of type 'String [JavaScript Object]'
原始实现代码:
var array = documentContract.getItemValueArray("EmailAddress") var result = ""; for (var i=0; i<array.length; i++) { if ( array[i].includes("@mydomain.com")) { result = result + array[i] + "\n";} } return result;
报错原因
XPages的服务端JavaScript运行环境基于Rhino引擎,仅支持ES5及更早版本的JS标准,没有实现ES6新增的字符串includes()方法。
另外getItemValueArray()接口返回的数组元素,本质是被JS引擎包装的Java String对象,不是原生JS字符串,哪怕typeof()检测返回string类型,也不代表该对象具备新版JS的原型方法,直接调用不存在的includes()就会触发上述类型错误,单纯提前调用toString()无法解决方法本身不存在的问题。
修复方法
直接放弃includes()写法,改用所有版本JS、Java字符串都原生支持的indexOf()方法做子串匹配,逻辑完全等价:当目标子串存在时,indexOf()返回子串起始下标(值≥0),不存在时固定返回-1。
修复后可直接运行的代码:
var emailArray = documentContract.getItemValueArray("EmailAddress") var matchedRecipients = []; for (var i = 0; i < emailArray.length; i++) { // 显式转字符串兜底,兼容空值、非字符串类型的异常值 var currentEmail = emailArray[i] ? emailArray[i].toString() : ""; // 用indexOf做匹配,兼容XPages的SSJS运行环境 if (currentEmail.indexOf("@mydomain.com") !== -1) { matchedRecipients.push(currentEmail); } } // 需要换行分隔的字符串就调用join,若收件人字段支持数组入参可直接返回matchedRecipients return matchedRecipients.join("\n");
优化提示
- 遍历前可以先判断
emailArray是否为空,避免字段无值时遍历空对象报错 - 若需要忽略邮箱地址的大小写做匹配,可以在判断前将邮箱值统一转为小写:
currentEmail.toLowerCase().indexOf("@mydomain.com") !== -1,避免大小写差异导致漏匹配 - 用数组收集匹配结果后统一拼接,比循环中反复做字符串拼接的执行效率更高,后续适配不同收件人格式的成本也更低
内容的提问来源于stack exchange,提问作者Mark Maden
相关产品推荐
相关产品推荐

