Rego中如何合并对象内的集合类型值?
Rego嵌套对象集合合并问题解决方案
给定输入对象:
input_data = { "1": { "bob": {"a", "b", "c"}, "kim": {"c", "e", "f"} }, "2": { "may": {"x", "k"}, "kim": {"y"} } }
需要将每个顶层键(如"1"、"2")对应的内层对象中所有集合的值合并为单个集合,期望输出:
output = { "1": {"a", "b", "c", "e", "f" }, "2": {"x", "k", "y"} }
你之前尝试的代码报错eval_conflict_error: object keys must be unique,原因是原写法会为每个集合元素生成一个重复的顶层键值对,违反了Rego对象键必须唯一的规则。
正确实现代码
merge_sets(input_data) := result { result := { key: merged | some key nested := input_data[key] merged := { val | some _, set; nested[_] = set; val in set } } }
代码说明
- 外层遍历输入对象的每个顶层键
key,确保每个键只被处理一次 - 对每个顶层键,获取对应的内层嵌套对象
nested - 通过集合推导式遍历内层对象的所有集合,将所有元素收集到
merged集合中 - 最终构造出顶层键与合并后集合一一对应的结果对象
调用merge_sets(input_data)即可得到期望的输出结果。
内容的提问来源于stack exchange,提问作者navi
相关产品推荐
相关产品推荐

