如何使用Jsonata从两个对象数组中筛选SUCCESS状态的对应属性?
解决Jsonata筛选匹配数组元素的问题
原始数据结构
{"first-array": [{"param1": {"status": "SUCCESS"}}, {"param2": {"status": "FAILURE"}}, {"param3": {"status": "SUCCESS"}}], "second-array": [{"param1": {"attribute1": "1", "attribute2": "2"}}, {"param2": {"attribute3": "3", "attribute4": "4"}}, {"param3": {"attribute5": "5", "attribute6": "6"}}]}
目标结果
[{"param1": {"attribute1": "1", "attribute2": "2"}}, {"param3": {"attribute5": "5", "attribute6": "6"}}]
可行的Jsonata查询表达式
second-array[ $keys($) in $first-array.*[status = "SUCCESS"] ~> $keys() ]
表达式拆解
提取成功状态的参数名:
$first-array.*[status = "SUCCESS"] ~> $keys()first-array.*展开数组内的每个对象,取出包含status的属性值[status = "SUCCESS"]过滤出状态为SUCCESS的项~> $keys()提取这些项对应的外层键名,最终得到数组["param1", "param3"]
筛选second-array对应项:
second-array[ $keys($) in ... ]$keys($)获取当前second-array元素的键名(比如第一个元素的键是param1)in判断该键是否在第一步得到的成功参数名数组中,符合条件的元素会被保留
你之前尝试的问题解析
- 使用
merge出现覆盖:merge是针对对象的合并逻辑,当多个对象有同名键时会直接覆盖,而你的需求是保留数组中独立的元素对象,merge不适用该场景。 first-array.*[status = "SUCCESS"]丢失键:这个表达式只提取了status对应的对象值,没有保留外层的param1/param3键名,无法和second-array的键做对应匹配,必须用$keys()提取键名才能完成关联筛选。
内容的提问来源于stack exchange,提问作者LuisGA
相关产品推荐
相关产品推荐

