如何在Rego中将对象的键转换为小写(值保持不变)?
在Rego中将对象键转为小写(值保持不变)的实现方法
需求是将如下Rego对象:
d := {"a": "aye", "B": "bEe"}
转换为键全小写、值保持不变的对象:
l := {"a": "aye", "b": "bEe"}
尝试过以下无效写法:
d := {"a": "aye", "B": "bEe"} l1 := { k: lower(v) | k = d[_]; v = d[k] } l2 := { k: lower(v) | k = d[_], v = d[k] } l3 := { k : lower(v) | k = d[_] v = d[k] }
更多无效尝试:
l4 := {k: v | k := lower(k), v := v} l5 := {k: v | k := lower k, v := d[k]} l6 := {k: v | k := lower(d[k]), v := d[k]}
对应的Python实现方式为:
l = {k.lower(): v for k, v in d.items()}
正确的Rego实现
可以通过一行对象推导完成需求:
d := {"a": "aye", "B": "bEe"} l := {lower(k): v | k, v := d[_]}
说明
- Rego的对象推导语法中,
k, v := d[_]可以直接解构获取原对象中的每一组键值对; lower(k)将原键转为小写,作为新对象的键,v直接复用原对象的值即可;- 之前的写法错误在于:要么对值调用了
lower()(而非键),要么出现了k := lower(k)这种循环引用的非法赋值逻辑,导致无法正确生成目标对象。
内容的提问来源于stack exchange,提问作者theherk
相关产品推荐
相关产品推荐

