DataWeave 1.0 lower函数未按预期工作,需实现大小写不敏感的键值过滤移除功能
DataWeave 1.0 lower函数未按预期工作,需实现大小写不敏感的键值过滤移除功能
我明白你的问题了——你现在的函数只能精确匹配大小写完全一致的键或值,但你想要实现不区分大小写、且匹配包含指定关键词的键值对移除功能,对吧?咱们来一步步修复这个问题。
原脚本的问题分析
你的核心需求是:只要键(比如phone、Phone、secondaryPhone)或值(比如Phone)包含指定关键词且不区分大小写,就移除对应的键值对。但原脚本的判断逻辑是精确匹配转小写后的键/值是否完全等于filterList里的元素,这就导致像secondaryPhone、Phone这类包含关键词但不完全相等的情况匹配不上。
修改后的脚本
%dw 1.0 %output application/json skipNullOn="everywhere" %function remove(content, filterList) content match { :array -> $ map (value,index) -> remove(value, filterList), :object -> $ mapObject (value,key) -> (key): null when (filterList any (lower key as :string contains lower $)) otherwise remove(value, filterList) , default -> null when ((content !=null) and (filterList any (lower content as :string contains lower $))) otherwise content } --- remove(payload,["phone","email","accountNumber"])
关键改动说明
键的匹配逻辑:把原来的
filterList contains (lower key as :string)改成filterList any (lower key as :string contains lower $)any操作符用来检查filterList中是否存在任意一个元素满足后续条件- 同时把关键词也转成小写,保证完全不区分大小写的匹配
- 用
contains替代精确匹配,实现“包含关键词即可匹配”的需求
值的匹配逻辑:把原来的
filterList contains content as :string改成filterList any (lower content as :string contains lower $)- 同样的逻辑,确保值只要包含指定关键词(不区分大小写)就会被移除
测试验证
用你提供的输入:
{ "phone":"123-234-9872", "Type":"Phone", "aType": ["T1", "T2"] }
运行修改后的脚本,输出完全符合你的预期:
{ "aType": ["T1", "T2"] }
备注:内容来源于stack exchange,提问作者daringfireball
相关产品推荐
相关产品推荐

