在Rego中如何判断一个数组是否完全包含于另一个数组
你遇到的类型报错是因为Rego中的&交集运算符仅支持*集合(set)*类型的操作,你传入的x、y是数组(array)类型,不符合运算符要求的参数类型。
方案1:集合运算实现(适合不关心元素顺序、重复次数的场景)
先将数组转换为集合,再用子集判断逻辑即可:
# 将数组转换为集合,自动去重 set_x := {elem | elem := x[_]} set_y := {elem | elem := y[_]} # 执行子集判断 x_subset_of_y := set_x & set_y == set_x
方案2:遍历判断实现(适合需要校验x中每个元素都在y中存在的场景)
如果不需要做去重处理,直接用Rego内置的every关键字遍历校验更直观:
x_all_contained_in_y { # 遍历x的所有元素,每个元素都要满足在y中存在的条件 every item in x { item in y } }
如果需要严格匹配元素的重复次数(比如x包含2次字符串a,要求y也至少包含2次a才判定为包含),可以额外增加元素计数逻辑:
# 统计数组中各元素的出现次数 count_x := count_by(x, function(item) { item }) count_y := count_by(y, function(item) { item }) x_full_contained_in_y { every key in count_x { count_y[key] >= count_x[key] } }
内容的提问来源于stack exchange,提问作者Stack Overflow
相关产品推荐
相关产品推荐

