jsonnet std.map - "attempted to index array with string name" 错误
jsonnet std.map - "attempted to index array with string name" error
我是 jsonnet 新手
我正在尝试为不同的操作分别调用 name 和 nb。但是当我在代码中使用“specificValues.data.LIST.name”时出现错误“试图用字符串名称索引数组”。
local NbMap = { ABC: 1, XYZ: 4 },
LIST: std.map(function(key_name) {
name: key_name,
nb: NbMap[key_name],
}, std.objectFields(NbMap)),
local specificParameters = {
ConfigMap: {
'data': {
connect: [
{ ...
name: 'ALL',
...
filter: std.join(';', std.map(function(name) name + ':NAM==[' + name + ']', specificValues.data.LIST.name)),
...
},
]
+
[
{
Max: specificValues.data.LIST.nb / 5,
...
name: NbMap.name,
...
}
for name in specificValues.data.LIST.name
],
},
},
我不知道如何在 jsonnet 中调用索引。如果有人知道请告诉我。
第一点相关反馈:您真的应该提供从您的用例中提取的 narrowed-down 可用 摘录,否则这是人们试图提供帮助的额外努力你,这显然对 them/us.
不公平
这里的主要问题是你以某种方式假设你可以循环,例如LIST.name
,jsonnet
不是这种情况:唯一可能的理解是对数组的理解:[entry for entry in array]
(array
这里也可以是 std.objectFields(obj)
或 std.objectValues(obj)
如果你首先处理对象)。
在下面粘贴我认为您想要实现的可能解决方案(代码和清单输出):
代码
local NbMap = { ABC: 1, XYZ: 4 };
local specificValues = {
data: {
LIST: std.map(function(key_name) {
name: key_name,
nb: NbMap[key_name],
}, std.objectFields(NbMap)),
},
};
local specificParameters = {
ConfigMap: {
data: {
connect: [
// Loop over each LIST entry to generate `connect` string
{
name: 'ALL',
filter: std.join(';', std.map(function(x) x.name + ':NAM==[' + x.name + ']', specificValues.data.LIST)),
},
] + [
// Loop over each LIST entry to add {Max: .., name: ...}
{
Max: entry.nb / 5,
name: entry.name,
}
for entry in specificValues.data.LIST
],
},
},
};
// Show specificParameters manifest rendering
specificParameters
输出
{
"ConfigMap": {
"data": {
"connect": [
{
"filter": "ABC:NAM==[ABC];XYZ:NAM==[XYZ]",
"name": "ALL"
},
{
"Max": 0.20000000000000001,
"name": "ABC"
},
{
"Max": 0.80000000000000004,
"name": "XYZ"
}
]
}
}
}
我是 jsonnet 新手
我正在尝试为不同的操作分别调用 name 和 nb。但是当我在代码中使用“specificValues.data.LIST.name”时出现错误“试图用字符串名称索引数组”。
local NbMap = { ABC: 1, XYZ: 4 },
LIST: std.map(function(key_name) {
name: key_name,
nb: NbMap[key_name],
}, std.objectFields(NbMap)),
local specificParameters = {
ConfigMap: {
'data': {
connect: [
{ ...
name: 'ALL',
...
filter: std.join(';', std.map(function(name) name + ':NAM==[' + name + ']', specificValues.data.LIST.name)),
...
},
]
+
[
{
Max: specificValues.data.LIST.nb / 5,
...
name: NbMap.name,
...
}
for name in specificValues.data.LIST.name
],
},
},
我不知道如何在 jsonnet 中调用索引。如果有人知道请告诉我。
第一点相关反馈:您真的应该提供从您的用例中提取的 narrowed-down 可用 摘录,否则这是人们试图提供帮助的额外努力你,这显然对 them/us.
不公平这里的主要问题是你以某种方式假设你可以循环,例如LIST.name
,jsonnet
不是这种情况:唯一可能的理解是对数组的理解:[entry for entry in array]
(array
这里也可以是 std.objectFields(obj)
或 std.objectValues(obj)
如果你首先处理对象)。
在下面粘贴我认为您想要实现的可能解决方案(代码和清单输出):
代码
local NbMap = { ABC: 1, XYZ: 4 };
local specificValues = {
data: {
LIST: std.map(function(key_name) {
name: key_name,
nb: NbMap[key_name],
}, std.objectFields(NbMap)),
},
};
local specificParameters = {
ConfigMap: {
data: {
connect: [
// Loop over each LIST entry to generate `connect` string
{
name: 'ALL',
filter: std.join(';', std.map(function(x) x.name + ':NAM==[' + x.name + ']', specificValues.data.LIST)),
},
] + [
// Loop over each LIST entry to add {Max: .., name: ...}
{
Max: entry.nb / 5,
name: entry.name,
}
for entry in specificValues.data.LIST
],
},
},
};
// Show specificParameters manifest rendering
specificParameters
输出
{
"ConfigMap": {
"data": {
"connect": [
{
"filter": "ABC:NAM==[ABC];XYZ:NAM==[XYZ]",
"name": "ALL"
},
{
"Max": 0.20000000000000001,
"name": "ABC"
},
{
"Max": 0.80000000000000004,
"name": "XYZ"
}
]
}
}
}