JSONNET Получить положение элемента в массиве - PullRequest
0 голосов
/ 10 ноября 2019

Я использую jsonnet для настройки моих панелей в Grafana. Я использую его впервые и мне это очень нравится. Однако мне трудно разобраться в некоторых аспектах.

У меня есть что-то похожее на следующее:

.addTemplate(
  template.new(
    microservices,
    datasource='',
    query=std.join(',', std.map(function(x) x.text, service['microservices'])),
    label= services,
  )

Что я пытаюсь сделать сейчас, это получить с помощью микросервиса, позиция, которую он занимает, чтобы иметь возможность назначить его службе переменных (а затем получить мои пользовательские значения с query = std.join (',', std.map (function (x) x.text), service ['microservices'])), ).

local services = std.extVar('services');
local service = services[x?];

Переменная служба имеет следующий вид:

[
  {
    // I'm trying to get this array position where my value is
    "key": "asd",
    "microservices": [
      {
        "key": "I HAVE THIS VALUE",
        "text": "ads"
      },
      {
        "key": "asd",
        "text": "ads"
      },
      {
        "key": "asd",
        "text": "asd"
      }
    ],
    "name": "bca",
    "services: [
      {
        "key": "bca",
        "name": "bca"
      }
    ]
  },
  {
    "key": "bca",
    "microservices": [
      {
        "key": "bca",
        "text": "bca"
      },
      {
        "key": "bca",
        "text": "bca"
      }
    ],
    "name": "bca",
    "services: [
      {
        "key": "bca",
        "name": "bca"
      }
    ]
  },
  {
    "key": "abc",
    "microservices": [
      {
        "key": "bca",
        "text": "bca"
      }
    ],
    "name": "abc",
    "services: [
      {
        "key": "ccc",
        "name": "ccc"
      }
    ]
  }
]

На любом другом языке это мне кажетсяочень простая операция.

var srv type
for x, service := range services{
  for _, microservice := range service.microservices{
    if microservice.key == "my value"{
      srv= services[x]
    }
}

Любой совет?

Большое вам спасибо.

1 Ответ

1 голос
/ 11 ноября 2019

Это также очень простая операция в Jsonnet. Наиболее естественный способ сделать это - использовать массивы, которые также удобно поддерживают фильтрацию:

local service2 = [
    s for s in services
    if [ms for ms in s.microservices if ms.key == "I HAVE THIS VALUE"] != []
][0];

Обратите внимание на индексирование [0] - в целом может быть более одной или не найдено ни одной соответствующей службы в целом. Так что если вы хотите получить первый, вам нужно принять это явно.

Приведенный выше код написан с предположением, что вам не важен фактический индекс, вам нужно только получить эту услугу. Если вам это нужно, все становится немного сложнее:

local serviceIndex = [
  x for x in std.range(0, std.length(services) - 1)
  if [ms for ms in services[x].microservices if ms.key == "I HAVE THIS VALUE"] != []
][0];

Кстати, вы могли бы достичь того же результата с такими функциями, как std.filter, но это было бы немного более многословно.

Кстати, я бы также рассмотрел возможность извлечения функции hasMicroservice(service, msKey) для улучшения читаемости фильтрации.

...