在舵图中 - 我有 2 个字典,一个是静态的,另一个是动态的 我想合并这两个字典,以便动态值替换静态值,但我不想让动态字典将没有静态值的键添加到生成字典中
例如 - 词典 1:
{{ $static := dict "FIRST_NAME" "first" "LAST_NAME" "last" }}
{{ $dynamic := dict "FIRST_NAME" "John" "KEY_TO_REMOVE" "something" }}
...
data:
{{ merge $dynamic $static | toYaml | indent 2}}
结果:
...
data:
FIRST_NAME: John
LAST_NAME: last
KEY_TO_REMOVE: something
我希望它的结果是:
...
data:
FIRST_NAME: John
LAST_NAME: last
我可以通过使用
range
和 index
的组合来循环遍历合并的字典并仅打印 $static
中存在的项目来实现此目标,但我正在寻找一种更干净的“一行”解决方案
我认为如果不手动迭代其中一本字典,这是不可能的。
在这种情况下,我可以通过使用
range
迭代静态字典并一次发出一个键来完成此操作,而不尝试专门生成结果对象作为变量。
data:
{{- range $key, $sv := range $static }}
{{ $key }}: {{ get $dynamic $key | default $sv | toJson }}
{{- end }}
(这样写有很多实际问题:
$dynamic
中的空值将被忽略;这是只考虑顶级键的浅层合并;我已经避免了一些潜在棘手的引用问题。)
Helm 在内部使用 Sprig 支持库来实现其大部分扩展。这里的问题在于可用的字典函数集。我可以从
keys
中获取 $static
,并且可以从 pick
中获取 $dynamic
特定值,但是 pick
采用一组静态键作为位置参数;你无法注入列表。
{{/* sadly not an option */}}
{{- $filtered := keys $static | xargs pick $dynamic -}}
如果
$static
真的那么静态,那么你可以使用 pick
,但我猜实际上并非如此。
{{/* will work iff you know exactly the keys of $static in code */}}
{{ $static := dict "FIRST_NAME" "first" "LAST_NAME" "last" }}
{{ $dynamic := dict "FIRST_NAME" "John" "KEY_TO_REMOVE" "something" }}
{{ $filtered := pick $dynamic "FIRST_NAME" "LAST_NAME" }}
data:
{{ merge $filtered $static | toYaml | indent 2}}