JSONNET 获取元素在数组中的位置
JSONNET Get the position of an element in an array
我正在使用 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]
}
}
有什么建议吗?
非常感谢。
在Jsonnet中也是很简单的操作。最自然的方法是使用数组理解,它也方便地支持过滤:
local service2 = [
s for s in services
if [ms for ms in s.microservices if ms.key == "I HAVE THIS VALUE"] != []
][0];
请注意索引 [0]
- 通常可能有多个或 none 个匹配服务。所以如果你想得到第一个,你需要明确地接受它。
上面的代码是在您不关心实际索引的情况下编写的,您只想检索此服务。如果你需要它,它会变得稍微复杂一点:
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)
来增强过滤的可读性。
我正在使用 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]
}
}
有什么建议吗?
非常感谢。
在Jsonnet中也是很简单的操作。最自然的方法是使用数组理解,它也方便地支持过滤:
local service2 = [
s for s in services
if [ms for ms in s.microservices if ms.key == "I HAVE THIS VALUE"] != []
][0];
请注意索引 [0]
- 通常可能有多个或 none 个匹配服务。所以如果你想得到第一个,你需要明确地接受它。
上面的代码是在您不关心实际索引的情况下编写的,您只想检索此服务。如果你需要它,它会变得稍微复杂一点:
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)
来增强过滤的可读性。