【问题标题】:JSONNET Get the position of an element in an arrayJSONNET 获取数组中元素的位置
【发布时间】:2019-11-10 20:20:52
【问题描述】:

我正在使用 jsonnet 在 Grafana 中配置我的面板。我是第一次使用它,我非常喜欢它。但是,我很难理解某些方面。

我有类似以下内容:

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

我现在要做的是获取给定微服务的位置,以便能够将其分配给变量服务(然后通过 query=std.xml 获取我的自定义值。 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]
    }
}

有什么建议吗?

非常感谢。

【问题讨论】:

    标签: for-loop jsonnet


    【解决方案1】:

    在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 等函数获得相同的结果,但这会更冗长。

    BTW2 我也会考虑提取一个函数hasMicroservice(service, msKey) 来增强过滤的可读性。

    【讨论】:

    • 非常感谢@sbarzowski 的详细解释。更好地理解 jsonnet 中 for 循环的操作对我来说非常有用。我要做的是获得该服务或位置(服务足够),但是当它包含某个微服务密钥时。一个服务包含 n 个微。如果它包含特定的微服务密钥(只有一种可能性),我想获得该服务。或者数组中的那个位置。我将尝试从您与我共享的代码中嵌套循环。再次非常感谢你,非常好。
    • @HugoL.M 哦,我错过了第二关。感谢您指出了这一点。我更新了答案以包含它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多