如何在Helm模板中提取列表内指定键匹配特定值的项的属性
方案1:直接用Sprig函数实现(推荐)
可以组合使用Sprig的select和first函数直接过滤列表,不需要手动写循环:
{{- /* 筛选所有awesome为true的条目,取第一个的itemName,无匹配时返回nope */ }} {{ (first (select "awesome" .Values.items)).itemName | default "nope" }}
方案2:手动循环实现(兼容所有版本)
你之前的代码存在3个问题:
- 循环内用
:=会重新声明局部变量,不会修改外层的$result - if判断逻辑写反,仅在已经找到结果后才会触发赋值
hasKey的参数格式错误,属性名需要加引号
适配Helm 3.0+版本的写法:
{{- $result := "nope" }} {{- range $i := .Values.items }} {{- if and (hasKey $i "awesome") $i.awesome (eq $result "nope") }} {{- $result = $i.itemName }} {{- end }} {{- end }} {{ $result }}
兼容旧版本Helm的写法:
如果使用的Helm版本不支持变量重赋值,可以用字典存储结果规避作用域限制:
{{- $ctx := dict "result" "nope" }} {{- range $i := .Values.items }} {{- if and (hasKey $i "awesome") $i.awesome (eq $ctx.result "nope") }} {{- $_ := set $ctx "result" $i.itemName }} {{- end }} {{- end }} {{ $ctx.result }}
内容的提问来源于stack exchange,提问作者User12547645
相关产品推荐
相关产品推荐

