For loop JSONNET获取数组中元素的位置

For loop JSONNET获取数组中元素的位置,for-loop,jsonnet,For Loop,Jsonnet,我正在使用配置Grafana中的面板。我第一次使用它,我非常喜欢它。然而,我很难理解某些方面 我有一些类似于以下内容: .addTemplate( template.new( microservices, datasource='', query=std.join(',', std.map(function(x) x.text, service['microservices'])), label= services, ) 我现在要做的是,给定一个微服务,

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

我有一些类似于以下内容:

.addTemplate(
  template.new(
    microservices,
    datasource='',
    query=std.join(',', std.map(function(x) x.text, service['microservices'])),
    label= services,
  )
我现在要做的是,给定一个微服务,获取它所占据的位置,以便能够将其分配给变量服务,然后获取我的自定义值,其中query=std.join',',std.mapfunctionx x.text,service['microservices']

变量服务具有以下形式:

[
  {
    // 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型 对于x,服务:=范围服务{ 对于_,微服务:=范围服务。微服务{ 如果microservice.key==我的值{ srv=服务[x] } } 有小费吗


非常感谢。

这在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,我还考虑提取一个函数,使用MaService Service,MSKEY来提高过滤的可读性。

< P>这也是JSONET中的一个非常简单的操作。最自然的方法是用数组理解,也方便地支持过滤:

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,我也考虑提取一个函数,使用MaService Service,MSKEY来提高过滤的可读性。

非常感谢@ SBARZOWSKY的详细解释。对我来说,了解JSONET中for循环的操作是非常有用的。我所要做的是得到那个服务或位置SE。服务是足够的,但当它包含某个微服务密钥时。一个服务包含n个微。如果它包含一个特定的微服务密钥,我想获得该服务。只有一种可能性。或者在数组中的那个位置。我将尝试嵌套您与我共享的代码中的循环。再次非常感谢,非常感谢。@HugoL.m哦,我错过了t第二级。谢谢你指出这一点。我更新了答案以包含它。非常感谢@sbarzowski的详细解释。对我来说,更好地理解jsonnet中for循环的操作非常有用。我试图做的是让该服务或position服务足够,但当它包含某个微服务密钥。一个服务包含n个微。如果它包含一个特定的微服务密钥,我想得到该服务。或者是阵列中的那个位置。我将尝试嵌套您与我共享的代码中的循环。再次非常感谢,非常感谢。@HugoL.m哦,我错过了第二级。谢谢您指出这一点我更新了答案,把它包括进去了。