在Open Policy Agent的Rego中如何对数组元素应用函数并存储结果
Rego中逐元素处理字符串数组的实现方案
你需要的「遍历数组每个元素、执行自定义处理逻辑、最终输出整合后的结果数组」的能力,是Rego原生支持的核心功能,无需依赖第三方扩展,最适合初学者上手的实现方式为列表推导(List Comprehension)。
基础实现逻辑
和其他编程语言中map高阶函数的作用完全等价,Rego的列表推导不需要手动编写循环语句,仅通过声明式语法就能自动完成遍历、处理、收集结果的全流程,核心结构为:
[处理逻辑表达式 | 遍历变量 in 原始数组, 可选过滤条件]
可直接复用的代码示例
假设你的实际格式化需求为:对数组内每个字符串裁剪首尾空格、转为小写、拼接固定前缀formatted_,完整运行代码如下:
# 原始字符串数组来源,可替换为从input、规则存储中读取的实际值 source_strings := [" Test1", "TEST2 ", " sample "] # 单元素自定义处理逻辑,可根据你的格式要求任意修改 format_element(s) := concat("", ["formatted_", lower(trim_space(s))]) # 逐元素处理生成最终结果数组 final_result := [format_element(item) | item in source_strings]
代码执行后,final_result的输出值为["formatted_test1", "formatted_test2", "formatted_sample"],完全满足格式适配的需求。
扩展用法
- 支持按需过滤元素:如果部分元素不需要进入最终结果,直接在遍历环节追加判断条件即可,比如仅保留长度大于3的处理结果:
final_result := [format_element(item) | item in source_strings, count(trim_space(item)) > 3] - 兼容所有内置字符串处理函数:
upper、regex.replace、split、contains等Rego内置的字符串处理能力,都可以直接嵌入单元素处理逻辑中,不需要做数组维度的特殊适配。
新手避坑提示
- Rego是声明式语言,不支持命令式的逐次向数组追加元素的循环写法,这类写法会直接触发语法报错,所有集合转换逻辑优先使用列表推导实现。
- 如果自定义处理逻辑针对某个输入元素返回未定义的空值,对应元素会自动从最终结果数组中剔除,无需额外编写过滤判断逻辑。
内容的提问来源于stack exchange,提问作者sv251
相关产品推荐
相关产品推荐

