ServiceNow自定义脚本数组映射报错:Unexpected token >
问题解决与优化方案
一、修复语法错误
出现Parsing error: Unexpected token >的核心原因是ServiceNow服务器端脚本引擎(Rhino)不支持ES6箭头函数(=>),需将箭头函数替换为传统function写法,同时修正原代码中的逻辑偏差:
原错误代码:
dict = data.map((item) => Object.fromEntries(Object.entries(item).map(([key, value]) => [mapper[key], value])));
修复后基础可运行版本:
var result = {}; data.forEach(function(item) { Object.keys(item).forEach(function(key) { // 修正逻辑:mapper的键是bv1这类值,而非item的key(如b1) var bValue = item[key]; if (mapper[bValue]) { var cKey = 'c' + key.slice(1); // 从b1推导对应c1 result[mapper[bValue]] = item[cKey]; } }); });
二、大数据处理优化(避免全遍历)
针对海量数据,核心优化思路是只处理目标相关键值,避免遍历对象所有属性,以下两种方案按需选择:
方案1:固定目标键提取(性能最优)
若需提取的bX/cX键是固定的(如b1、b3、b5),直接指定目标键列表,跳过无效遍历:
var targetBKeys = ['b1', 'b3', 'b5']; var result = {}; data.forEach(function(item) { targetBKeys.forEach(function(bKey) { var bValue = item[bKey]; if (bValue && mapper[bValue]) { var cKey = 'c' + bKey.slice(1); result[mapper[bValue]] = item[cKey]; } }); });
方案2:按规则匹配提取(灵活性高)
若目标键符合b后接奇数的规律,用正则匹配筛选,无需硬编码键名:
var result = {}; var bKeyRule = /^b(\d+)$/; data.forEach(function(item) { Object.keys(item).forEach(function(key) { var match = key.match(bKeyRule); if (match) { var num = parseInt(match[1], 10); if (num % 2 === 1) { // 仅处理奇数项 var bValue = item[key]; if (mapper[bValue]) { var cKey = 'c' + num; result[mapper[bValue]] = item[cKey]; } } } }); });
三、关键注意事项
- 语法兼容性:ServiceNow服务器端脚本仅支持ES5及以下语法,禁止使用箭头函数、解构赋值等ES6特性,否则会触发解析错误。
- 性能提升点:
- 直接通过键名访问属性(
item['b1'])比Object.entries全遍历效率高30%以上 - 提前定义目标规则/列表,减少无效循环次数
- 直接通过键名访问属性(
- 逻辑修正:原代码中
mapper[key]是错误逻辑,mapper的键是bv1这类值(item中b1的属性值),而非item的键名(如b1)。
内容的提问来源于stack exchange,提问作者Maddy
相关产品推荐
相关产品推荐

