jsonnet - 如何在 jsonnet 中进行正确的 for 循环?
问题描述
每次我以为我终于理解了 jsonnet 时,它就来打我的脸...... -.-
我有以下内容:
local applyModifications(kp) = {
[topLvlKey]: {
[subKey]: myfunction(kp[topLvlKey][subKey])
for subKey in std.objectFieldsAll(kp[topLvlKey])
},
for topLvlKey in std.objectFieldsAll(kp)
};
我想遍历一个对象的前 2 个级别内的所有内容,并在那里应用一些函数......
基本上这是可行的......但取决于我是否使用std.objectFieldsAll
or std.objectFields
,隐藏字段在之后可见或完全丢失。
在不触及隐藏的“财产”的情况下,我将/如何做到这一点?我理解我的问题是,我在这里使用了对象理解并且(参考错误消息)那些“对象理解不能有隐藏字段”......但据我了解 jsonnet,一些东西理解是唯一的创建for循环的方法,对吗?
测试代码:
// vim: set ts=2 sw=2 expandtab :
local myfunction(o) = o {
spec+: {
foo: 'bar'
}
};
local applyModifications(kp) = {
[topLvlKey]: {
[subKey]: myfunction(kp[topLvlKey][subKey])
for subKey in std.objectFieldsAll(kp[topLvlKey])
},
for topLvlKey in std.objectFieldsAll(kp)
};
local stack = {
fooService: {
fooResource: {
kind: 'PrometheusRule',
spec: {
groups: [
{ name: 'fooGroup', rules: [{ alert: 'fooAlert', expr: 'fooExpr' }] },
{ name: 'barGroup', rules: [{ alert: 'fooAlert', expr: 'fooExpr' }] },
],
},
},
},
fooService2:: {
fooResource: {
kind: 'PrometheusRule',
spec: {
groups: [
{ name: 'fooGroup', rules: [{ alert: 'fooAlert', expr: 'fooExpr' }] },
{ name: 'barGroup', rules: [{ alert: 'fooAlert', expr: 'fooExpr' }] },
],
},
},
},
};
local stack2 = applyModifications(stack);
{
modified: stack2
}
解决方案
你可以通过继承实现你想要的。
local applyModifications(obj, f) =
obj + {
[x] : f(obj[x]) for x in std.objectFieldsAll(obj)
}
;
applyModifications({
visible: "foo",
hidden:: "bar",
}, function(x) x + " modified")
为清楚起见,这是单级,但创建两级版本应该很简单(如果您有任何问题,请告诉我)。
它起作用的原因:
是“默认可见性”,它采用了它覆盖的字段的可见性。(你也有强制可见的字段::
)。
也就是说,你处于尴尬的境地,通常可以避免。Jsonnet 中的对象替换了其他语言的对象(结构/类实例)和映射(字典)。尽管这两个概念是统一的,但 OOP 特性并不总是能很好地与数据结构特性配合使用。
通常您想将每个对象视为:
- 一个数据对象,保持所有字段可见并避免自我/超级。您可以轻松地汇总处理这些字段。
- OOP 对象或结构。您可以使用
self
andsuper
,隐藏字段等。您可以手动处理每个字段,因为每个字段可能具有完全不同的含义和行为。
预计数据对象包含 OOP 对象,反之亦然。当一个物体处于某个中间地带时,就会出现尴尬。
但据我了解jsonnet,一些理解是创建for循环的唯一方法,对吧?
理解并不特别。不要将它们视为命令式语言中的“for 循环”。数组推导基本上是 std.map 和 std.filter 的语法糖(具有任意嵌套)。
推荐阅读
- python - Spotipy - 如何从给定索引开始的播放列表中获取歌曲?
- javascript - JS:Promises 的预期行为
- python - 为什么breakpoint()在for循环中不提示幂等位置?
- reactjs - 如何将 inCart 值存储在 localStorage 中?
- python - 我只想将肿瘤与(脑肿瘤 MRI 图像)图像分离,这意味着活动轮廓
- laravel - 在 Laravel 中删除返回 404 Not Found 并且不删除
- neo4j - 此查询是否为节点分配了新标签?
- javascript - 如何在地图函数中调用api
- python - F字符串自动完成python
- azure-devops - 如何从 Azure DevOps 访问 pagesBatch?