Snaplogic:在Mapper Snap中同时使用mapValue与mapKey函数的问题
实现Salesforce字段名处理与日期时区转换的JQ方案
从Salesforce导出的文档有两个格式需求:
- 移除字段名的
__c后缀并全部转为小写 - 将UTC格式的日期字段(比如
CreatedDate)转换为US/Eastern时区
当前尝试用mapKeys和mapValues组合处理,但代码无法同时满足两个需求:
$.mapKeys((value, key)=>key.endsWith('__c') ? key.replace('__c','').toLowerCase() :key.toLowerCase()) && $.mapValues((value, key) => key.toLowerCase().search("createddate") >=0 && value !=null ? Date.parse(value).toLocaleDateTimeString({"timeZone":"US/Arizona"}) :value)
调换操作顺序或修改逻辑运算符后,始终只能生效一个处理逻辑,以下是解决方案:
问题原因
你用&&连接两个JQ操作是错误的,JQ需要用管道符|来链式执行操作——先处理字段名,再基于处理后的字段名处理日期值。另外代码里时区写的是US/Arizona,和需求的US/Eastern不符,日期处理的语法也存在问题。
修正后的代码
$.mapKeys((value, key) => key.endsWith('__c') ? key.replace('__c', '').toLowerCase() : key.toLowerCase() ) | .mapValues((value, key) => key == "createddate" && value != null ? new Date(value).toLocaleDateTimeString("en-US", { timeZone: "US/Eastern" }) : value )
代码说明
- 字段名处理:通过
mapKeys遍历所有字段,移除__c后缀并统一转为小写 - 链式传递:用
|将处理完字段名的对象传给mapValues,保证后续操作基于新的字段名执行 - 日期转换:判断当前字段是否是处理后的
createddate,若值不为空,先把UTC字符串转为Date对象,再用toLocaleDateTimeString转换为US/Eastern时区的可读日期字符串 - 非日期字段:保持原有值不变
内容的提问来源于stack exchange,提问作者user1453999
相关产品推荐
相关产品推荐

