如果列表项具有 key==value,则从列表中获取值

Get value from list if list-item has key==value

我有以下yaml

items:
   - itemName: a
     awesome: true
   - itemName: b
   - itemName: c
     awesome: false

我需要一个将 a 作为输出的函数,因为项目 a 具有属性 awesome == true我该怎么做?

无效的方法:

{{- $result := "nope" }}
{{- range $i := $items }}
  {{- if and (and (hasKey $i. awesome) ($i.awesome)) !($result -eq "nope") }}
    {{- $result := $i.itemName }}
  {{- end }}
{{- end }}

没有尝试过上述方法,但我确信这行不通(参见 ). What I'd need is a default function that works for lists. I could not find any in sprig。有什么想法吗?

链接的 ,您声称您知道该代码不起作用,在问题片段中,预先声明变量。

在您的代码中,您确实预先声明了变量,但您犯了不同的错误。错误是您正在使用 := 将值分配给预先声明的变量,但是模板中的 := 与 Go 本身的工作方式相同,它初始化一个新变量。您需要使用 = 对现有变量进行赋值。

https://pkg.go.dev/text/template@go1.17.2#hdr-Variables

A pipeline inside an action may initialize a variable to capture the result. The initialization has syntax

$variable := pipeline

where $variable is the name of the variable. An action that declares a variable produces no output.

Variables previously declared can also be assigned, using the syntax

$variable = pipeline

所以你需要做的就是把{{- $result := $i.itemName }}改成{{- $result = $i.itemName }}

{{- $result := "nope" }}
{{- range $i := $items }}
  {{- if and (and (hasKey $i. awesome) ($i.awesome)) !($result -eq "nope") }}
    {{- $result = $i.itemName }}
  {{- end }}
{{- end }}

一个证明这是有效的例子:https://play.golang.org/p/A44yl7jo0v7