如何用Mixin方式替换Jsonnet数组中的指定元素
如何在Libsonnet中替换数组内的指定元素
我明白你的困扰了——直接用volumes+:追加新元素只会在数组里多添一个同名的卷,没法替换掉原来的emptyDir类型卷。要实现替换,我们需要先过滤掉数组中不需要的旧元素,再把新元素加进去,具体操作如下:
核心思路
利用Libsonnet的数组推导式过滤掉目标元素,再将新元素追加到过滤后的数组中,最后覆盖原对象的volumes字段。
完整代码示例
// 定义原始的对象 local original = { volumes: [ { emptyDir: {}, name: 'grafana-storage' }, { configMap: { name: 'grafana-dashboard-apiserver' }, name: ' grafana-dashboard-apiserver' } ] }; // 执行替换操作 original + { volumes: [ // 过滤掉name为grafana-storage的旧元素 for vol in original.volumes if vol.name != 'grafana-storage' ] + [ // 添加新的persistentVolumeClaim类型卷 { name: 'grafana-storage', persistentVolumeClaim: { claimName: 'product-nfs' } } ] }
代码解释
- 过滤旧元素:通过
for vol in original.volumes if vol.name != 'grafana-storage'遍历原数组,只保留name不等于grafana-storage的元素,这样就把原来的emptyDir卷排除在外了。 - 追加新元素:把我们需要的新卷对象追加到过滤后的数组末尾。
- 覆盖原字段:用
+运算符将处理后的新数组赋值给原对象的volumes字段,完成替换。
这种方法不受原元素在数组中的位置影响,不管它是在开头还是中间,都能准确替换。如果需要替换多个元素,还可以把条件改成if vol.name not in ['grafana-storage', 'other-volume-name']来批量过滤。
内容的提问来源于stack exchange,提问作者Roger Song
相关产品推荐
相关产品推荐

