Сравните два массива на языке Rego

violation[{"msg": msg}] {
    required:= ["red", "green", "blue"]
    input := ["orange", "purple"]

    msg := sprintf("")
}

Я хочу сравнить каждое значение из входного массива в требуемом массиве. В других языках это делают два обычных цикла. но на языке Rego это не петли. Кто-нибудь знает, как я могу это сделать?

3 ответа

См. Раздел документации об итерации, чтобы узнать, как перебирать коллекцию. Однако часто более идиоматично работать с наборами. Следуя вашему примеру:

violation[{"msg": msg}] {
    required := {"red", "green", "blue"}
    input.colors := {"orange", "purple"}
    
    count(required - input.colors) != 0

    msg := sprintf("input.colors (%v) does not contain all required colors (%v), [input.colors, required]")
}

Переменные colorSet и requiredSet показывают, как преобразовать массив в set.

С использованием == оператор мы можем выяснить, присутствуют ли все цвета или нет

      package play

default allColorPresent = false

allColorPresent  {
   colorSet := {x | x := input.colors[_]} 
   requiredSet := {x | x := input. required[_]}
   colorSet == requiredSet
}

Есть много способов сделать это:

      import future.keywords.in

violation[{"msg": msg}] {
    required:= ["red", "green", "blue"]
    input_colors := ["orange", "purple", "blue"]
    
    wrong_colors := [ color | color := input_colors[_]; not (color in cast_set(required)) ]
    count(wrong_colors) > 0
    msg := sprintf("(%v) not in required colors (%v)", [wrong_colors, required])
}
      import future.keywords.in
import future.keywords.every

all_colors_present(input_colors, required_colours) {
    every color in input_colors {
        color in cast_set(required_colours)
    }
}

violation[{"msg": msg}] {
    required:= ["red", "green", "blue"]
    input_colors := ["r", "green", "blue"]
    
    not all_colors_present(input_colors, required)
    msg := "not all colors present!"
}
Другие вопросы по тегам